/ Hex Artifact Content
Login

Artifact 0eba75a0a4a7a4ea0d68ecf01a21f145e351984fa4efe101c54caaa244d671ae:


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 20 20  EFERENCES */..  
5e10: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5e20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5e30: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
5e40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
5e50: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5e60: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5e70: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
5e80: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
5e90: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
5ea0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
5eb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5ec0: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
5ed0: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
5ee0: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
5ef0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5f00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
5f10: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5f20: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5f30: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
5f40: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
5f50: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
5f60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
5f70: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
5f80: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
5f90: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
5fa0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
5fb0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5fc0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
5fd0: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
5fe0: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
5ff0: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
6000: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
6010: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
6020: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
6030: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
6040: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
6050: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
6060: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
6070: 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20  t cnt){.#ifndef 
6080: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
6090: 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53  ASIDE.  void *pS
60a0: 74 61 72 74 3b 0a 20 20 0a 20 20 69 66 28 20 73  tart;.  .  if( s
60b0: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
60c0: 73 65 64 28 64 62 2c 30 29 3e 30 20 29 7b 0a 20  sed(db,0)>0 ){. 
60d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
60e0: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
60f0: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
6100: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
6110: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
6120: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
6130: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
6140: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
6150: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
6160: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
6170: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
6180: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
6190: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
61a0: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
61b0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
61c0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
61d0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
61e0: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
61f0: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6200: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
6210: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
6220: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
6230: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
6240: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
6250: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
6260: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
6270: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
6280: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6290: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
62a0: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
62b0: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
62c0: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
62d0: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
62e0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
62f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6300: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6310: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
6320: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
6330: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6340: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
6350: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
6360: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
6370: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
6380: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
6390: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
63a0: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
63b0: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
63c0: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
63d0: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
63e0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
63f0: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
6400: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74  >lookaside.pInit
6410: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
6420: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b  aside.pFree = 0;
6430: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
6440: 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20  .sz = (u16)sz;. 
6450: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
6460: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f     int i;.    Lo
6470: 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a  okasideSlot *p;.
6480: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e      assert( sz >
6490: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f   (int)sizeof(Loo
64a0: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a  kasideSlot*) );.
64b0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
64c0: 65 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a 20  e.nSlot = cnt;. 
64d0: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
64e0: 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20  eSlot*)pStart;. 
64f0: 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20     for(i=cnt-1; 
6500: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
6510: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
6520: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74  >lookaside.pInit
6530: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
6540: 61 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70 3b  aside.pInit = p;
6550: 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  .      p = (Look
6560: 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38  asideSlot*)&((u8
6570: 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a  *)p)[sz];.    }.
6580: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6590: 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20  e.pEnd = p;.    
65a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
65b0: 69 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  isable = 0;.    
65c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
65d0: 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d  alloced = pBuf==
65e0: 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b  0 ?1:0;.  }else{
65f0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6600: 64 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a  de.pStart = db;.
6610: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6620: 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20  e.pEnd = db;.   
6630: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
6640: 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  Disable = 1;.   
6650: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
6660: 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20  Malloced = 0;.  
6670: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6680: 6e 53 6c 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  nSlot = 0;.  }.#
6690: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
66a0: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a  OMIT_LOOKASIDE *
66b0: 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
66c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
66d0: 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20  eturn the mutex 
66e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
66f0: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
6700: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ction..*/.sqlite
6710: 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33  3_mutex *sqlite3
6720: 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65  _db_mutex(sqlite
6730: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
6740: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6750: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6760: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6770: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
6780: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
6790: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
67a0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
67b0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75  .  return db->mu
67c0: 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  tex;.}../*.** Fr
67d0: 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65  ee up as much me
67e0: 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66  mory as we can f
67f0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61  rom the given da
6800: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
6810: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
6820: 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
6830: 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a  memory(sqlite3 *
6840: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  db){.  int i;..#
6850: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6860: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
6870: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
6880: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
6890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
68a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
68b0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
68c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
68d0: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
68e0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
68f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
6900: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
6910: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
6920: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
6930: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
6940: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6950: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
6960: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
6970: 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
6980: 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nk(pPager);.    
6990: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
69a0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
69b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
69c0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
69d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
69e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
69f0: 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79   Flush any dirty
6a00: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
6a10: 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e  ger-cache for an
6a20: 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  y attached datab
6a30: 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a  ase.** to disk..
6a40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
6a50: 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c  b_cacheflush(sql
6a60: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6a70: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
6a80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
6a90: 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a  bSeenBusy = 0;..
6aa0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6ab0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
6ac0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
6ad0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
6ae0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
6af0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6b00: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6b10: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6b20: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6b30: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6b40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
6b50: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
6b60: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6b70: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
6b80: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
6b90: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
6ba0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
6bb0: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
6bc0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6bd0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
6be0: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
6bf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6c00: 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a  rFlush(pPager);.
6c10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6c20: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
6c30: 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d       bSeenBusy =
6c40: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
6c50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6c60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6c70: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
6c80: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
6c90: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6ca0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6cb0: 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
6cc0: 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73  E_OK && bSeenBus
6cd0: 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  y) ? SQLITE_BUSY
6ce0: 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
6cf0: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   Configuration s
6d00: 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69  ettings for an i
6d10: 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61  ndividual databa
6d20: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f  se connection.*/
6d30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
6d40: 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a  config(sqlite3 *
6d50: 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  db, int op, ...)
6d60: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
6d70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
6d80: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
6d90: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
6da0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42    case SQLITE_DB
6db0: 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d  CONFIG_MAINDBNAM
6dc0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d  E: {.      /* IM
6dd0: 50 3a 20 52 2d 30 36 38 32 34 2d 32 38 35 33 31  P: R-06824-28531
6de0: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50   */.      /* IMP
6df0: 3a 20 52 2d 33 36 32 35 37 2d 35 32 31 32 35 20  : R-36257-52125 
6e00: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  */.      db->aDb
6e10: 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 76  [0].zDbSName = v
6e20: 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b  a_arg(ap,char*);
6e30: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6e40: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  TE_OK;.      bre
6e50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6e60: 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  se SQLITE_DBCONF
6e70: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
6e80: 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66        void *pBuf
6e90: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
6ea0: 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  id*); /* IMP: R-
6eb0: 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20  26835-10964 */. 
6ec0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61       int sz = va
6ed0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
6ee0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
6ef0: 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20  7871-25994 */.  
6f00: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61      int cnt = va
6f10: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
6f20: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34      /* IMP: R-04
6f30: 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20  460-53386 */.   
6f40: 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f     rc = setupLoo
6f50: 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c  kaside(db, pBuf,
6f60: 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20   sz, cnt);.     
6f70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6f80: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6f90: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
6fa0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20  struct {.       
6fb0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a   int op;      /*
6fc0: 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   The opcode */. 
6fd0: 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b         u32 mask;
6fe0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
6ff0: 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65  he bit in sqlite
7000: 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63  3.flags to set/c
7010: 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20  lear */.      } 
7020: 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aFlagOp[] = {.  
7030: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
7040: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
7050: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 53  KEY,           S
7060: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
7070: 73 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  s    },.        
7080: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
7090: 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
70a0: 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
70b0: 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d  EnableTrigger  }
70c0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
70d0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
70e0: 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45  LE_FTS3_TOKENIZE
70f0: 52 2c 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f  R, SQLITE_Fts3To
7100: 6b 65 6e 69 7a 65 72 20 20 7d 2c 0a 20 20 20 20  kenizer  },.    
7110: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
7120: 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41  ONFIG_ENABLE_LOA
7130: 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 20 53 51 4c  D_EXTENSION, SQL
7140: 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  ITE_LoadExtensio
7150: 6e 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  n  },.        { 
7160: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
7170: 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45  NO_CKPT_ON_CLOSE
7180: 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 6f  ,      SQLITE_No
7190: 43 6b 70 74 4f 6e 43 6c 6f 73 65 20 20 7d 2c 0a  CkptOnClose  },.
71a0: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
71b0: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
71c0: 5f 51 50 53 47 2c 20 20 20 20 20 20 20 20 20 20  _QPSG,          
71d0: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
71e0: 53 47 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  SG     },.      
71f0: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
7200: 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
7210: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
7220: 45 5f 54 72 69 67 67 65 72 45 51 50 20 20 20 20  E_TriggerEQP    
7230: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
7240: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45  LITE_DBCONFIG_RE
7250: 53 45 54 5f 44 41 54 41 42 41 53 45 2c 20 20 20  SET_DATABASE,   
7260: 20 20 20 20 20 53 51 4c 49 54 45 5f 52 65 73 65       SQLITE_Rese
7270: 74 44 61 74 61 62 61 73 65 20 20 7d 2c 0a 20 20  tDatabase  },.  
7280: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
7290: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
72a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
72b0: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
72c0: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
72d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
72e0: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
72f0: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
7300: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
7310: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
7320: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
7330: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
7340: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
7350: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
7360: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
7370: 20 20 20 20 75 33 32 20 6f 6c 64 46 6c 61 67 73      u32 oldFlags
7380: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
7390: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
73a0: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
73b0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
73c0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
73d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
73e0: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
73f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
7400: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
7410: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
7420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7430: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
7440: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
7450: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7460: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
7470: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
7480: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7490: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
74b0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
74c0: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
74d0: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
74e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
74f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
7500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7530: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
7540: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
7550: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
7560: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
7570: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
7580: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
7590: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
75a0: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
75b0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
75c0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
75d0: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
75e0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
75f0: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
7600: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
7610: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
7620: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
7630: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
7640: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
7650: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
7660: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
7670: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
7680: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
7690: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
76a0: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
76b0: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
76c0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
76d0: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
76e0: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
76f0: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
7700: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
7710: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
7720: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
7730: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
7740: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
7750: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
7760: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
7770: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20  1 : nKey2;.  /* 
7780: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
7790: 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20 62  5033-28449 The b
77a0: 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63  uilt-in BINARY c
77b0: 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65  ollation compare
77c0: 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 62  s.  ** strings b
77d0: 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69 6e  yte by byte usin
77e0: 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66  g the memcmp() f
77f0: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  unction from the
7800: 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a   standard C.  **
7810: 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20 61   library. */.  a
7820: 73 73 65 72 74 28 20 70 4b 65 79 31 20 26 26 20  ssert( pKey1 && 
7830: 70 4b 65 79 32 20 29 3b 0a 20 20 72 63 20 3d 20  pKey2 );.  rc = 
7840: 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
7850: 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
7860: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
7870: 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20  padFlag.     && 
7880: 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72  allSpaces(((char
7890: 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79  *)pKey1)+n, nKey
78a0: 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c  1-n).     && all
78b0: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
78c0: 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e  Key2)+n, nKey2-n
78d0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
78e0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
78f0: 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52 54 52  -31624-24737 RTR
7900: 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e 41 52  IM is like BINAR
7910: 59 20 65 78 63 65 70 74 20 74 68 61 74 20 65 78  Y except that ex
7920: 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73 70 61  tra.      ** spa
7930: 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ces at the end o
7940: 66 20 65 69 74 68 65 72 20 73 74 72 69 6e 67 20  f either string 
7950: 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
7960: 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68  e result. In oth
7970: 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 64  er.      ** word
7980: 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c 6c 20  s, strings will 
7990: 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
79a0: 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61 73 20   one another as 
79b0: 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20 20 20  long as they.   
79c0: 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c     ** differ onl
79d0: 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  y in the number 
79e0: 6f 66 20 73 70 61 63 65 73 20 61 74 20 74 68 65  of spaces at the
79f0: 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   end..      */. 
7a00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7a10: 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65  rc = nKey1 - nKe
7a20: 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  y2;.    }.  }.  
7a30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7a40: 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c  .** Another buil
7a50: 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73  t-in collating s
7a60: 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e  equence: NOCASE.
7a70: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c   .**.** This col
7a80: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
7a90: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
7aa0: 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73 65  e used for "case
7ab0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20   independent.** 
7ac0: 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c  comparison". SQL
7ad0: 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20  ite's knowledge 
7ae0: 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  of upper and low
7af0: 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c 65  er case equivale
7b00: 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f  nts.** extends o
7b10: 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63 68  nly to the 26 ch
7b20: 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69 6e  aracters used in
7b30: 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e   the English lan
7b40: 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20  guage..**.** At 
7b50: 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65  the moment there
7b60: 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38   is only a UTF-8
7b70: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
7b80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
7b90: 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
7ba0: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
7bb0: 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
7bc0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
7bd0: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
7be0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
7bf0: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d  ey2.){.  int r =
7c00: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
7c10: 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63  (.      (const c
7c20: 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f  har *)pKey1, (co
7c30: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32  nst char *)pKey2
7c40: 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f  , (nKey1<nKey2)?
7c50: 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20  nKey1:nKey2);.  
7c60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
7c70: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  (NotUsed);.  if(
7c80: 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d   0==r ){.    r =
7c90: 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20   nKey1-nKey2;.  
7ca0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
7cb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7cc0: 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  e ROWID of the m
7cd0: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
7ce0: 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36  t.*/.sqlite_int6
7cf0: 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  4 sqlite3_last_i
7d00: 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69  nsert_rowid(sqli
7d10: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
7d20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
7d30: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
7d40: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
7d50: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
7d60: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
7d70: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
7d80: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
7d90: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
7da0: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
7db0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
7dc0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
7dd0: 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  e sqlite3_last_i
7de0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50  nsert_rowid() AP
7df0: 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
7e00: 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f  oid sqlite3_set_
7e10: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
7e20: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73  d(sqlite3 *db, s
7e30: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f  qlite3_int64 iRo
7e40: 77 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  wid){.#ifdef SQL
7e50: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
7e60: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
7e70: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
7e80: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
7e90: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
7ea0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
7eb0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
7ec0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7ed0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7ee0: 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d   db->lastRowid =
7ef0: 20 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74   iRowid;.  sqlit
7f00: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7f10: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a  b->mutex);.}../*
7f20: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
7f30: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
7f40: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
7f50: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
7f60: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
7f70: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
7f80: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
7f90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7fa0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
7fb0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7fc0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
7fd0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
7fe0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
7ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8000: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
8010: 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a  rn db->nChange;.
8020: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8030: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
8040: 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  anges since the 
8050: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
8060: 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69  was opened..*/.i
8070: 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  nt sqlite3_total
8080: 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  _changes(sqlite3
8090: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
80a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
80b0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
80c0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
80d0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
80e0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
80f0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
8100: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
8110: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f    return db->nTo
8120: 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  talChange;.}../*
8130: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70  .** Close all op
8140: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54  en savepoints. T
8150: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
8160: 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69  y manipulates fi
8170: 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64  elds of the.** d
8180: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
8190: 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e  bject, it does n
81a0: 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76  ot close any sav
81b0: 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79  epoints that may
81c0: 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74   be open.** at t
81d0: 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20  he b-tree/pager 
81e0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  level..*/.void s
81f0: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
8200: 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  oints(sqlite3 *d
8210: 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d  b){.  while( db-
8220: 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  >pSavepoint ){. 
8230: 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54     Savepoint *pT
8240: 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  mp = db->pSavepo
8250: 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61  int;.    db->pSa
8260: 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
8270: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
8280: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d  e3DbFree(db, pTm
8290: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53  p);.  }.  db->nS
82a0: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
82b0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
82c0: 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e   0;.  db->isTran
82d0: 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
82e0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
82f0: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
8300: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73  ctor function as
8310: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75  sociated with Fu
8320: 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e  ncDef p, if any.
8330: 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74   Except,.** if t
8340: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  his is not the l
8350: 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ast copy of the 
8360: 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74  function, do not
8370: 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74   invoke it. Mult
8380: 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f  iple.** copies o
8390: 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74  f a single funct
83a0: 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20  ion are created 
83b0: 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63  when create_func
83c0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
83d0: 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f  .** with SQLITE_
83e0: 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ANY as the encod
83f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
8400: 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  oid functionDest
8410: 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  roy(sqlite3 *db,
8420: 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20   FuncDef *p){.  
8430: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
8440: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d  pDestructor = p-
8450: 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a  >u.pDestructor;.
8460: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
8470: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
8480: 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ctor->nRef--;.  
8490: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
84a0: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
84b0: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
84c0: 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74 72  >xDestroy(pDestr
84d0: 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61  uctor->pUserData
84e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
84f0: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73 74  DbFree(db, pDest
8500: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
8510: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63   }.}../*.** Disc
8520: 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74  onnect all sqlit
8530: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20  e3_vtab objects 
8540: 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64  that belong to d
8550: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8560: 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69  on.** db. This i
8570: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62  s called when db
8580: 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64   is being closed
8590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
85a0: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
85b0: 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ab(sqlite3 *db){
85c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
85d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
85e0: 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73  E.  int i;.  Has
85f0: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69  hElem *p;.  sqli
8600: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
8610: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
8620: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8630: 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  {.    Schema *pS
8640: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
8650: 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  i].pSchema;.    
8660: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
8670: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
8680: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
8690: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
86a0: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
86b0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
86c0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
86d0: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
86e0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
86f0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
8700: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
8710: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
8720: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
8730: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
8740: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71  }.  }.  for(p=sq
8750: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
8760: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20  b->aModule); p; 
8770: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
8780: 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65  (p)){.    Module
8790: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
87a0: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
87b0: 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  a(p);.    if( pM
87c0: 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20  od->pEpoTab ){. 
87d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
87e0: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70  Disconnect(db, p
87f0: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20  Mod->pEpoTab);. 
8800: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8810: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
8820: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
8830: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
8840: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
8850: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
8860: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
8870: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
8880: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8890: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
88a0: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
88b0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
88c0: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
88d0: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
88e0: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
88f0: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
8900: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
8910: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
8920: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8930: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
8940: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
8950: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
8960: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
8970: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
8980: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
8990: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
89a0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
89b0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
89c0: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
89d0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
89e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
89f0: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
8a00: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
8a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8a20: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
8a30: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
8a40: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
8a50: 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45   !db ){.    /* E
8a60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
8a70: 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e  257-11740 Callin
8a80: 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  g sqlite3_close(
8a90: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
8aa0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77  te3_close_v2() w
8ab0: 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  ith a NULL point
8ac0: 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  er argument is a
8ad0: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
8ae0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
8af0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8b00: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
8b10: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
8b20: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
8b30: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
8b40: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
8b50: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8b60: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
8b70: 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53  ( db->mTrace & S
8b80: 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
8b90: 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72  E ){.    db->xTr
8ba0: 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43 45  ace(SQLITE_TRACE
8bb0: 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72 61  _CLOSE, db->pTra
8bc0: 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a 20  ceArg, db, 0);. 
8bd0: 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78   }..  /* Force x
8be0: 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73  Disconnect calls
8bf0: 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   on all virtual 
8c00: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63  tables */.  disc
8c10: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62  onnectAllVtab(db
8c20: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  );..  /* If a tr
8c30: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
8c40: 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63  n, the disconnec
8c50: 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20  tAllVtab() call 
8c60: 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  above.  ** will 
8c70: 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20  not have called 
8c80: 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28  the xDisconnect(
8c90: 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20  ) method on any 
8ca0: 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62  virtual.  ** tab
8cb0: 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61  les in the db->a
8cc0: 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20  VTrans[] array. 
8cd0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  The following sq
8ce0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
8cf0: 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69  k().  ** call wi
8d00: 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65  ll do so. We nee
8d10: 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66  d to do this bef
8d20: 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f  ore the check fo
8d30: 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51  r active.  ** SQ
8d40: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c  L statements bel
8d50: 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62  ow, as the v-tab
8d60: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
8d70: 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67  n may be storing
8d80: 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61  .  ** some prepa
8d90: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69  red statements i
8da0: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
8db0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
8dc0: 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a  lback(db);..  /*
8dd0: 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72   Legacy behavior
8de0: 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28   (sqlite3_close(
8df0: 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20 74  ) behavior) is t
8e00: 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  o return.  ** SQ
8e10: 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65  LITE_BUSY if the
8e20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20   connection can 
8e30: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
8e40: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  mediately..  */.
8e50: 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62    if( !forceZomb
8e60: 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e  ie && connection
8e70: 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20  IsBusy(db) ){.  
8e80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
8e90: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
8ea0: 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74  _BUSY, "unable t
8eb0: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
8ec0: 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20  nfinalized ".   
8ed0: 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20      "statements 
8ee0: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  or unfinished ba
8ef0: 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c  ckups");.    sql
8f00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8f10: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
8f20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
8f30: 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  USY;.  }..#ifdef
8f40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
8f50: 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
8f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
8f70: 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
8f80: 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61  * Closing the ha
8f90: 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
8fa0: 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
8fb0: 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f   the value 2. */
8fc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
8fd0: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
8fe0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
8ff0: 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
9000: 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a   db, 0, 2);.  }.
9010: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e  #endif..  /* Con
9020: 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  vert the connect
9030: 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69  ion into a zombi
9040: 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65  e and then close
9050: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e   it..  */.  db->
9060: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
9070: 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73  AGIC_ZOMBIE;.  s
9080: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
9090: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64  AndCloseZombie(d
90a0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
90b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
90c0: 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20   Two variations 
90d0: 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e  on the public in
90e0: 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73  terface for clos
90f0: 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
9100: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  * connection. Th
9110: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  e sqlite3_close(
9120: 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e  ) version return
9130: 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  s SQLITE_BUSY an
9140: 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20  d.** leaves the 
9150: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f  connection optio
9160: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 75  n if there are u
9170: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
9180: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
9190: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
91a0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e  sqlite3_backups.
91b0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c    The sqlite3_cl
91c0: 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73  ose_v2().** vers
91d0: 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63  ion forces the c
91e0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63  onnection to bec
91f0: 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20  ome a zombie if 
9200: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63  there are.** unc
9210: 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c  losed resources,
9220: 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f   and arranges fo
9230: 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  r deallocation w
9240: 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  hen the last.** 
9250: 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e  prepare statemen
9260: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
9270: 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69  kup closes..*/.i
9280: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
9290: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
92a0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
92b0: 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20  se(db,0); }.int 
92c0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
92d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
92e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
92f0: 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a  se(db,1); }.../*
9300: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75  .** Close the mu
9310: 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
9320: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a  connection db..*
9330: 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  *.** Furthermore
9340: 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  , if database co
9350: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61  nnection db is a
9360: 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67   zombie (meaning
9370: 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68   that there.** h
9380: 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20  as been a prior 
9390: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
93a0: 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c  close(db) or sql
93b0: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62  ite3_close_v2(db
93c0: 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20  )) and.** every 
93d0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73  sqlite3_stmt has
93e0: 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69   now been finali
93f0: 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73 71  zed and every sq
9400: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73  lite3_backup has
9410: 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68  .** finished, th
9420: 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  en free all reso
9430: 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urces..*/.void s
9440: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
9450: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73  AndCloseZombie(s
9460: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
9470: 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20  ashElem *i;     
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9490: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65  * Hash table ite
94a0: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  rator */.  int j
94b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
94c0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
94d0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72   sqlite3_stmt or
94e0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
94f0: 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20  objects.  ** or 
9500: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
9510: 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  n has not yet be
9520: 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c  en closed by sql
9530: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c  ite3_close_v2(),
9540: 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20  .  ** then just 
9550: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
9560: 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
9570: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63  .  if( db->magic
9580: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  !=SQLITE_MAGIC_Z
9590: 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74  OMBIE || connect
95a0: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
95b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
95c0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
95d0: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ex);.    return;
95e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
95f0: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
9600: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
9610: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9620: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a  nnection has.  *
9630: 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c  * closed all sql
9640: 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71  ite3_stmt and sq
9650: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
9660: 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65 65  ects and has bee
9670: 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f  n.  ** passed to
9680: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28   sqlite3_close (
9690: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
96a0: 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54  is a zombie).  T
96b0: 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67  herefore,.  ** g
96c0: 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65 65  o ahead and free
96d0: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a   all resources..
96e0: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20    */..  /* If a 
96f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
9700: 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63  pen, roll it bac
9710: 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73  k. This also ens
9720: 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a  ures that if.  *
9730: 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 73  * any database s
9740: 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e  chemas have been
9750: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20   modified by an 
9760: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  uncommitted tran
9770: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65  saction.  ** the
9780: 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64  y are reset. And
9790: 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69 72   that the requir
97a0: 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
97b0: 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a  is held to make.
97c0: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72    ** the pager r
97d0: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
97e0: 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d  ma reset an atom
97f0: 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f  ic operation. */
9800: 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  .  sqlite3Rollba
9810: 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
9820: 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  _OK);..  /* Free
9830: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
9840: 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63   Savepoint struc
9850: 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tures. */.  sqli
9860: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
9870: 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c  ts(db);..  /* Cl
9880: 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ose all database
9890: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
98a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
98b0: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
98c0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
98d0: 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20   &db->aDb[j];.  
98e0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
98f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
9900: 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70  treeClose(pDb->p
9910: 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  Bt);.      pDb->
9920: 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pBt = 0;.      i
9930: 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20  f( j!=1 ){.     
9940: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20     pDb->pSchema 
9950: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9960: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61   }.  }.  /* Clea
9970: 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d  r the TEMP schem
9980: 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64  a separately and
9990: 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64   last */.  if( d
99a0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
99b0: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
99c0: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
99d0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
99e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
99f0: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
9a00: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20  ;..  /* Free up 
9a10: 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75 78  the array of aux
9a20: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
9a30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   */.  sqlite3Col
9a40: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
9a50: 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ay(db);.  assert
9a60: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
9a70: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
9a80: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
9a90: 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74   );..  /* Tell t
9aa0: 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66  he code in notif
9ab0: 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e  y.c that the con
9ac0: 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65  nection no longe
9ad0: 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a  r holds any.  **
9ae0: 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20   locks and does 
9af0: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
9b00: 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e  further unlock-n
9b10: 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
9b20: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
9b30: 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28  onnectionClosed(
9b40: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71  db);..  for(i=sq
9b50: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
9b60: 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d  b->aFunc); i; i=
9b70: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9b80: 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  )){.    FuncDef 
9b90: 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20  *pNext, *p;.    
9ba0: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  p = sqliteHashDa
9bb0: 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  ta(i);.    do{. 
9bc0: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
9bd0: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
9be0: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
9bf0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
9c00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
9c10: 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74  .      p = pNext
9c20: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20  ;.    }while( p 
9c30: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9c40: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
9c50: 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73  Func);.  for(i=s
9c60: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9c70: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69  db->aCollSeq); i
9c80: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9c90: 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c  xt(i)){.    Coll
9ca0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
9cb0: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
9cc0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f  shData(i);.    /
9cd0: 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73  * Invoke any des
9ce0: 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65  tructors registe
9cf0: 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f  red for collatio
9d00: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20  n sequence user 
9d10: 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  data. */.    for
9d20: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
9d30: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
9d40: 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20  [j].xDel ){.    
9d50: 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65      pColl[j].xDe
9d60: 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72  l(pColl[j].pUser
9d70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9d80: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
9d90: 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20  ee(db, pColl);. 
9da0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
9db0: 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c  Clear(&db->aColl
9dc0: 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
9dd0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9de0: 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73  LTABLE.  for(i=s
9df0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9e00: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b  db->aModule); i;
9e10: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
9e20: 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(i)){.    Modul
9e30: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
9e40: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
9e50: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
9e60: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b  Mod->xDestroy ){
9e70: 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65  .      pMod->xDe
9e80: 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78  stroy(pMod->pAux
9e90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
9ea0: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
9eb0: 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20  sTableClear(db, 
9ec0: 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  pMod);.    sqlit
9ed0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
9ee0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
9ef0: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
9f00: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
9f10: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
9f20: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
9f30: 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20   /* Deallocates 
9f40: 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72  any cached error
9f50: 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73   strings. */.  s
9f60: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
9f70: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c  db->pErr);.  sql
9f80: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
9f90: 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c  ons(db);.#if SQL
9fa0: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
9fb0: 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65  ICATION.  sqlite
9fc0: 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e  3_free(db->auth.
9fd0: 7a 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71  zAuthUser);.  sq
9fe0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
9ff0: 75 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65  uth.zAuthPW);.#e
a000: 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  ndif..  db->magi
a010: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
a020: 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68  _ERROR;..  /* Th
a030: 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20  e temp-database 
a040: 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61  schema is alloca
a050: 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  ted differently 
a060: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73  from the other s
a070: 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63  chema.  ** objec
a080: 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65  ts (using sqlite
a090: 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c  Malloc() directl
a0a0: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71  y, instead of sq
a0b0: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
a0c0: 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20  ())..  ** So it 
a0d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
a0e0: 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68  d here. Todo: Wh
a0f0: 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74  y not roll the t
a100: 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a  emp schema into.
a110: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71    ** the same sq
a120: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20  liteMalloc() as 
a130: 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c  the one that all
a140: 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62  ocates the datab
a150: 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74  ase .  ** struct
a160: 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ure?.  */.  sqli
a170: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62  te3DbFree(db, db
a180: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
a190: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
a1a0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
a1b0: 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  ex);.  db->magic
a1c0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
a1d0: 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65  CLOSED;.  sqlite
a1e0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d  3_mutex_free(db-
a1f0: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
a200: 74 28 20 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73  t( sqlite3Lookas
a210: 69 64 65 55 73 65 64 28 64 62 2c 30 29 3d 3d 30  ideUsed(db,0)==0
a220: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f   );.  if( db->lo
a230: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
a240: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
a250: 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73  _free(db->lookas
a260: 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d  ide.pStart);.  }
a270: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a280: 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52  NABLE_SQLRR.  SR
a290: 52 65 63 43 6c 6f 73 65 28 64 62 29 3b 0a 23 65  RecClose(db);.#e
a2a0: 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c 69 74 65  ndif.  .  sqlite
a2b0: 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  3_free(db);.}../
a2c0: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
a2d0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
a2e0: 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  .  If tripCode i
a2f0: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
a300: 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69   then.** any wri
a310: 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  te cursors are i
a320: 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69  nvalidated ("tri
a330: 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74  pped" - as in "t
a340: 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69  ripping a circui
a350: 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61  t.** breaker") a
a360: 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72  nd made to retur
a370: 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68  n tripCode if th
a380: 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74  ere are any furt
a390: 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  her.** attempts 
a3a0: 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73  to use that curs
a3b0: 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72  or.  Read cursor
a3c0: 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e  s remain open an
a3d0: 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61  d valid.** but a
a3e0: 72 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61  re "saved" in ca
a3f0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67  se the table pag
a400: 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f  es are moved aro
a410: 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  und..*/.void sql
a420: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
a430: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
a440: 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e   tripCode){.  in
a450: 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61  t i;.  int inTra
a460: 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63  ns = 0;.  int sc
a470: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73  hemaChange;.  as
a480: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a490: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
a4a0: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
a4b0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
a4c0: 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  c();..  /* Obtai
a4d0: 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74  n all b-tree mut
a4e0: 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69  exes before maki
a4f0: 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20  ng any calls to 
a500: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e  BtreeRollback().
a510: 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69   .  ** This is i
a520: 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65  mportant in case
a530: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a540: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
a550: 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69  ck has.  ** modi
a560: 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
a570: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65  e schema. If the
a580: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20   b-tree mutexes 
a590: 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20  are not taken.  
a5a0: 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e  ** here, then an
a5b0: 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
a5c0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69  he connection mi
a5d0: 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74  ght sneak in bet
a5e0: 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61  ween.  ** the da
a5f0: 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20  tabase rollback 
a600: 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74  and schema reset
a610: 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73  , which can caus
a620: 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72  e false.  ** cor
a630: 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20  ruption reports 
a640: 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20  in some cases.  
a650: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
a660: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
a670: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20   schemaChange = 
a680: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
a690: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
a6a0: 6e 67 65 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  nge)!=0 && db->i
a6b0: 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20  nit.busy==0;..  
a6c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
a6d0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
a6e0: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
a6f0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
a700: 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   p ){.      if( 
a710: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
a720: 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20  Trans(p) ){.    
a730: 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b      inTrans = 1;
a740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a750: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
a760: 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ack(p, tripCode,
a770: 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b   !schemaChange);
a780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
a790: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
a7a0: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  (db);.  sqlite3E
a7b0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
a7c0: 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d 44  ;..  if( (db->mD
a7d0: 62 46 6c 61 67 73 26 44 42 46 4c 41 47 5f 53 63  bFlags&DBFLAG_Sc
a7e0: 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30 20 26  hemaChange)!=0 &
a7f0: 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
a800: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a810: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
a820: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
a830: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41     sqlite3ResetA
a840: 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65  llSchemasOfConne
a850: 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20  ction(db);.  }. 
a860: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
a870: 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a  veAll(db);..  /*
a880: 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f   Any deferred co
a890: 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
a8a0: 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65  ons have now bee
a8b0: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20  n resolved. */. 
a8c0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
a8d0: 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44  ns = 0;.  db->nD
a8e0: 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
a8f0: 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   0;.  db->flags 
a900: 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72  &= ~SQLITE_Defer
a910: 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  FKs;..  /* If on
a920: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  e has been confi
a930: 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68  gured, invoke th
a940: 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20  e rollback-hook 
a950: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66  callback */.  if
a960: 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43  ( db->xRollbackC
a970: 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72  allback && (inTr
a980: 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f  ans || !db->auto
a990: 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64  Commit) ){.    d
a9a0: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
a9b0: 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61  back(db->pRollba
a9c0: 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ckArg);.  }.}../
a9d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
a9e0: 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74  atic string cont
a9f0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
aa00: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
aa10: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
aa20: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ** specified in 
aa30: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
aa40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
aa50: 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d  ITE_NEED_ERR_NAM
aa60: 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  E).const char *s
aa70: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e  qlite3ErrName(in
aa80: 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63  t rc){.  const c
aa90: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
aaa0: 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20    int i, origRc 
aab0: 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = rc;.  for(i=0;
aac0: 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30   i<2 && zName==0
aad0: 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66  ; i++, rc &= 0xf
aae0: 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  f){.    switch( 
aaf0: 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  rc ){.      case
ab00: 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20   SQLITE_OK:     
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
ab20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b  e = "SQLITE_OK";
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ab50: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
ab70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52  me = "SQLITE_ERR
ab80: 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OR";            
ab90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aba0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  se SQLITE_INTERN
abb0: 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  AL:           zN
abc0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
abd0: 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20  TERNAL";        
abe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
abf0: 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a  ase SQLITE_PERM:
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
ac10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
ac20: 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERM";           
ac30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac40: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
ac50: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T:              
ac60: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ac70: 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20  ABORT";         
ac80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ac90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
aca0: 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20  RT_ROLLBACK:    
acb0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
acc0: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22  _ABORT_ROLLBACK"
acd0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
ace0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
acf0: 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SY:             
ad00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ad10: 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20  E_BUSY";        
ad20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
ad40: 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20  USY_RECOVERY:   
ad50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad60: 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59  TE_BUSY_RECOVERY
ad70: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
ad80: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ad90: 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20  BUSY_SNAPSHOT:  
ada0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
adb0: 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
adc0: 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
add0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ade0: 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20  _LOCKED:        
adf0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ae00: 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20  LITE_LOCKED";   
ae10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ae20: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae30: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
ae40: 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  ACHE: zName = "S
ae50: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
ae60: 52 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b  REDCACHE";break;
ae70: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ae80: 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20  TE_NOMEM:       
ae90: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
aea0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20  SQLITE_NOMEM";  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
aec0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aed0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20  ITE_READONLY:   
aee0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aef0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
af00: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
af10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
af20: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45  LITE_READONLY_RE
af30: 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d  COVERY:  zName =
af40: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
af50: 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65  Y_RECOVERY"; bre
af60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
af70: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
af80: 41 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65 20  ANTINIT:  zName 
af90: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
afa0: 4c 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62 72  LY_CANTINIT"; br
afb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
afc0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
afd0: 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65  ROLLBACK:  zName
afe0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
aff0: 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  NLY_ROLLBACK"; b
b000: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b010: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
b020: 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d  _DBMOVED:   zNam
b030: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b040: 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20  ONLY_DBMOVED";  
b050: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b060: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
b070: 59 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e 61  Y_DIRECTORY: zNa
b080: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
b090: 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 22  DONLY_DIRECTORY"
b0a0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b0b0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  se SQLITE_INTERR
b0c0: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e  UPT:          zN
b0d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
b0e0: 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  TERRUPT";       
b0f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b100: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b110: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
b120: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b130: 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20  OERR";          
b140: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b150: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b160: 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20  R_READ:         
b170: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b180: 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20  IOERR_READ";    
b190: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b1a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b1b0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20  RR_SHORT_READ:  
b1c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b1d0: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
b1e0: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
b1f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b200: 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20  ERR_WRITE:      
b210: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b220: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20  E_IOERR_WRITE"; 
b230: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b240: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b250: 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20  OERR_FSYNC:     
b260: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b270: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b  TE_IOERR_FSYNC";
b280: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b290: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b2a0: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a  IOERR_DIR_FSYNC:
b2b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b2c0: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
b2d0: 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  YNC";   break;. 
b2e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b2f0: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a  _IOERR_TRUNCATE:
b300: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b310: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
b320: 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATE";    break;.
b330: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b340: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20  E_IOERR_FSTAT:  
b350: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b360: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
b370: 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  T";       break;
b380: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b390: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a  TE_IOERR_UNLOCK:
b3a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b3b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
b3c0: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
b3d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b3e0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
b3f0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b400: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44  "SQLITE_IOERR_RD
b410: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
b420: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b430: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
b440: 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  E:       zName =
b450: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
b460: 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65  ELETE";      bre
b470: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b480: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
b490: 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  M:        zName 
b4a0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b4b0: 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72  NOMEM";       br
b4c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b4d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
b4e0: 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ESS:       zName
b4f0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b500: 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20 62  _ACCESS";      b
b510: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b520: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
b530: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a  ECKRESERVEDLOCK:
b540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b570: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
b580: 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  RVEDLOCK"; break
b590: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b5a0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20  ITE_IOERR_LOCK: 
b5b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b5c0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f  "SQLITE_IOERR_LO
b5d0: 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  CK";        brea
b5e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b5f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
b600: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
b610: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
b620: 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72 65  LOSE";       bre
b630: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b640: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
b650: 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20  CLOSE:    zName 
b660: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b670: 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72  DIR_CLOSE";   br
b680: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b690: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b6a0: 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65  OPEN:      zName
b6b0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b6c0: 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62  _SHMOPEN";     b
b6d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b6e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b6f0: 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d  MSIZE:      zNam
b700: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b710: 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20  R_SHMSIZE";     
b720: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b730: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b740: 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61  HMLOCK:      zNa
b750: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b760: 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20  RR_SHMLOCK";    
b770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b780: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b790: 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e  SHMMAP:       zN
b7a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b7b0: 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20  ERR_SHMMAP";    
b7c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b7d0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b7e0: 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a  _SEEK:         z
b7f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b800: 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20  OERR_SEEK";     
b810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b820: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b830: 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20  R_DELETE_NOENT: 
b840: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b850: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
b860: 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  NT";break;.     
b870: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b880: 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20  RR_MMAP:        
b890: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b8a0: 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20  _IOERR_MMAP";   
b8b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b8c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b8d0: 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a  ERR_GETTEMPPATH:
b8e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b8f0: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
b900: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
b910: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b920: 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OERR_CONVPATH:  
b930: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b940: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
b950: 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  H";    break;.  
b960: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b970: 49 4f 45 52 52 5f 56 4e 4f 44 45 3a 20 20 20 20  IOERR_VNODE:    
b980: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b990: 49 54 45 5f 49 4f 45 52 52 5f 56 4e 4f 44 45 22  ITE_IOERR_VNODE"
b9a0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b9b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b9c0: 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20  _CORRUPT:       
b9d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b9e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20  LITE_CORRUPT";  
b9f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ba00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ba10: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20  E_CORRUPT_VTAB: 
ba20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ba30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
ba40: 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AB";      break;
ba50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ba60: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20  TE_NOTFOUND:    
ba70: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ba80: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22  SQLITE_NOTFOUND"
ba90: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
baa0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bab0: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
bac0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bad0: 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20  "SQLITE_FULL";  
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
baf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb00: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
bb10: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bb20: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
bb30: 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  N";          bre
bb40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb50: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
bb60: 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20  OTEMPDIR: zName 
bb70: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
bb80: 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72  EN_NOTEMPDIR";br
bb90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bba0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bbb0: 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65  ISDIR:     zName
bbc0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
bbd0: 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62  PEN_ISDIR";    b
bbe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bbf0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bc00: 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d  _FULLPATH:  zNam
bc10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bc20: 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20  OPEN_FULLPATH"; 
bc30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc40: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
bc50: 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61  N_CONVPATH:  zNa
bc60: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
bc70: 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b  TOPEN_CONVPATH";
bc80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bc90: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
bca0: 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  OL:           zN
bcb0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52  ame = "SQLITE_PR
bcc0: 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20  OTOCOL";        
bcd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bce0: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
bcf0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
bd00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
bd10: 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20  MPTY";          
bd20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd30: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
bd40: 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  MA:             
bd50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd60: 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20  SCHEMA";        
bd70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bd80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
bd90: 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  BIG:            
bda0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bdb0: 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20  _TOOBIG";       
bdc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bdd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bde0: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
bdf0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
be00: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20  E_CONSTRAINT";  
be10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
be20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
be30: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
be40: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
be50: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
be60: 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  IQUE"; break;.  
be70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
be80: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
be90: 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  ER: zName = "SQL
bea0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
beb0: 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20  RIGGER";break;. 
bec0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bed0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
bee0: 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  IGNKEY:.        
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bf10: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
bf20: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20  NT_FOREIGNKEY"; 
bf30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bf40: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bf50: 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a  RAINT_CHECK:   z
bf60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bf70: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22  ONSTRAINT_CHECK"
bf80: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
bf90: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bfa0: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
bfb0: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bfe0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
bff0: 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65  IMARYKEY";   bre
c000: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c010: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c020: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20  _NOTNULL: zName 
c030: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c040: 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72  AINT_NOTNULL";br
c050: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c060: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c070: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20  T_COMMITHOOK:.  
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c0a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c0b0: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
c0c0: 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OOK";   break;. 
c0d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c0e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
c0f0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
c100: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c110: 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a  VTAB";   break;.
c120: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c130: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
c140: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20  CTION:.         
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c170: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c180: 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20  T_FUNCTION";    
c190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c1a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c1b0: 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e  AINT_ROWID:   zN
c1c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c1d0: 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b  NSTRAINT_ROWID";
c1e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c1f0: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  ase SQLITE_MISMA
c200: 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a  TCH:           z
c210: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
c220: 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20  ISMATCH";       
c230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c240: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55  case SQLITE_MISU
c250: 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SE:             
c260: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c270: 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20  MISUSE";        
c280: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c290: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c   case SQLITE_NOL
c2a0: 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  FS:             
c2b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c2c0: 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20  _NOLFS";        
c2d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c2e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55    case SQLITE_AU
c2f0: 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TH:             
c300: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c310: 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20  E_AUTH";        
c320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c330: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
c340: 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20  ORMAT:          
c350: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c360: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
c370: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c380: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c390: 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20  RANGE:          
c3a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c3b0: 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20  ITE_RANGE";     
c3c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c3d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c3e0: 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20  _NOTADB:        
c3f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c400: 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20  LITE_NOTADB";   
c410: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c420: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c430: 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20  E_ROW:          
c440: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c450: 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20  QLITE_ROW";     
c460: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c470: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c480: 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20  TE_NOTICE:      
c490: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c4a0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20  SQLITE_NOTICE"; 
c4b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c4c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c4d0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
c4e0: 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20  ER_WAL: zName = 
c4f0: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
c500: 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61  ECOVER_WAL";brea
c510: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c520: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c530: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20  VER_ROLLBACK:.  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c560: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c570: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
c580: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
c590: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c5a0: 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20  _WARNING:       
c5b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c5c0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20  LITE_WARNING";  
c5d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c5e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c5f0: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
c600: 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  DEX:  zName = "S
c610: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
c620: 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  TOINDEX"; break;
c630: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c640: 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20  TE_DONE:        
c650: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c660: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20  SQLITE_DONE";   
c670: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c680: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c690: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
c6a0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42    static char zB
c6b0: 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69  uf[50];.    sqli
c6c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
c6d0: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
c6e0: 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e   "SQLITE_UNKNOWN
c6f0: 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a  (%d)", origRc);.
c700: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66      zName = zBuf
c710: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
c720: 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
c730: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
c740: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
c750: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
c760: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
c770: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
c780: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
c790: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
c7a0: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
c7b0: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
c7c0: 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73   char* const aMs
c7d0: 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53  g[] = {.    /* S
c7e0: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
c7f0: 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72    */ "not an err
c800: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c810: 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a  TE_ERROR       *
c820: 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72  / "SQL logic err
c830: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c840: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
c850: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
c860: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
c870: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
c880: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
c890: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
c8a0: 54 20 20 20 20 20 20 20 2a 2f 20 22 71 75 65 72  T       */ "quer
c8b0: 79 20 61 62 6f 72 74 65 64 22 2c 0a 20 20 20 20  y aborted",.    
c8c0: 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20  /* SQLITE_BUSY  
c8d0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
c8e0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  se is locked",. 
c8f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43     /* SQLITE_LOC
c900: 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74  KED      */ "dat
c910: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
c920: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
c930: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20  QLITE_NOMEM     
c940: 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d    */ "out of mem
c950: 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ory",.    /* SQL
c960: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  ITE_READONLY    
c970: 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  */ "attempt to w
c980: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
c990: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
c9a0: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  * SQLITE_INTERRU
c9b0: 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75  PT   */ "interru
c9c0: 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  pted",.    /* SQ
c9d0: 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20  LITE_IOERR      
c9e0: 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72   */ "disk I/O er
c9f0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
ca00: 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20  ITE_CORRUPT     
ca10: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73  */ "database dis
ca20: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
ca30: 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rmed",.    /* SQ
ca40: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  LITE_NOTFOUND   
ca50: 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65   */ "unknown ope
ca60: 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20  ration",.    /* 
ca70: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20  SQLITE_FULL     
ca80: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
ca90: 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22  or disk is full"
caa0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cab0: 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22  CANTOPEN    */ "
cac0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
cad0: 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20  atabase file",. 
cae0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f     /* SQLITE_PRO
caf0: 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63  TOCOL    */ "loc
cb00: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a  king protocol",.
cb10: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d      /* SQLITE_EM
cb20: 50 54 59 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  PTY       */ 0,.
cb30: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43      /* SQLITE_SC
cb40: 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61  HEMA      */ "da
cb50: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
cb60: 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20  s changed",.    
cb70: 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  /* SQLITE_TOOBIG
cb80: 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67        */ "string
cb90: 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67   or blob too big
cba0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cbb0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20  _CONSTRAINT  */ 
cbc0: 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  "constraint fail
cbd0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cbe0: 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a  TE_MISMATCH    *
cbf0: 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d  / "datatype mism
cc00: 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51  atch",.    /* SQ
cc10: 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20  LITE_MISUSE     
cc20: 20 2a 2f 20 22 62 61 64 20 70 61 72 61 6d 65 74   */ "bad paramet
cc30: 65 72 20 6f 72 20 6f 74 68 65 72 20 41 50 49 20  er or other API 
cc40: 6d 69 73 75 73 65 22 2c 0a 23 69 66 64 65 66 20  misuse",.#ifdef 
cc50: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
cc60: 46 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  FS.    /* SQLITE
cc70: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
cc80: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
cc90: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
cca0: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53  ,.#else.    /* S
ccb0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
ccc0: 20 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20    */ 0,.#endif. 
ccd0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54     /* SQLITE_AUT
cce0: 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74  H        */ "aut
ccf0: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
cd00: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
cd10: 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f  E_FORMAT      */
cd20: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
cd30: 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f  E_RANGE       */
cd40: 20 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f   "column index o
cd50: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
cd60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
cd70: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
cd80: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
cd90: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
cda0: 54 45 5f 4e 4f 54 49 43 45 20 20 20 20 20 20 2a  TE_NOTICE      *
cdb0: 2f 20 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20  / "notification 
cdc0: 6d 65 73 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a  message",.    /*
cdd0: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20   SQLITE_WARNING 
cde0: 20 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20      */ "warning 
cdf0: 6d 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20  message",.  };. 
ce00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
ce10: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
ce20: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
ce30: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
ce40: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
ce50: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
ce60: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
ce70: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
ce80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ce90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
cea0: 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ROW: {.      zEr
ceb0: 72 20 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f 77  r = "another row
cec0: 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20   available";.   
ced0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
cee0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
cef0: 44 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45  DONE: {.      zE
cf00: 72 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f  rr = "no more ro
cf10: 77 73 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20  ws available";. 
cf20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cf30: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
cf40: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
cf50: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
cf60: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
cf70: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
cf80: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
cf90: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
cfa0: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
cfb0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
cfc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
cfd0: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
cfe0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cff0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
d000: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
d010: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
d020: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
d030: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
d040: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
d050: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
d060: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
d070: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d080: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
d090: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
d0a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
d0b0: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
d0c0: 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 6c 6f   to retry the lo
d0d0: 63 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ck.  Return zero
d0e0: 20 74 6f 20 73 74 6f 70 20 74 72 79 69 6e 67 0a   to stop trying.
d0f0: 2a 2a 20 61 6e 64 20 63 61 75 73 65 20 53 51 4c  ** and cause SQL
d100: 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ite to return SQ
d110: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74  LITE_BUSY..*/.st
d120: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
d130: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
d140: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c  ck(.  void *ptr,
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d160: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d170: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63  ction */.  int c
d180: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
d190: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d1a0: 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73   times table has
d1b0: 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   been busy */.  
d1c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
d1d0: 69 6c 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ile      /* The 
d1e0: 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68  file on which th
d1f0: 65 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64 20  e lock occurred 
d200: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
d210: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
d220: 55 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69 73  USLEEP.  /* This
d230: 20 63 61 73 65 20 69 73 20 66 6f 72 20 73 79 73   case is for sys
d240: 74 65 6d 73 20 74 68 61 74 20 68 61 76 65 20 73  tems that have s
d250: 75 70 70 6f 72 74 20 66 6f 72 20 73 6c 65 65 70  upport for sleep
d260: 69 6e 67 20 66 6f 72 20 66 72 61 63 74 69 6f 6e  ing for fraction
d270: 73 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f  s of.  ** a seco
d280: 6e 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20  nd.  Examples:  
d290: 41 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79 73 74  All windows syst
d2a0: 65 6d 73 2c 20 75 6e 69 78 20 73 79 73 74 65 6d  ems, unix system
d2b0: 73 20 77 69 74 68 20 75 73 6c 65 65 70 28 29 20  s with usleep() 
d2c0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
d2d0: 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a  t u8 delays[] =.
d2e0: 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20       { 1, 2, 5, 
d2f0: 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20  10, 15, 20, 25, 
d300: 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35  25,  25,  50,  5
d310: 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74  0, 100 };.  stat
d320: 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61  ic const u8 tota
d330: 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c  ls[] =.     { 0,
d340: 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33   1, 3,  8, 18, 3
d350: 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20  3, 53, 78, 103, 
d360: 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b  128, 178, 228 };
d370: 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59  .# define NDELAY
d380: 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79   ArraySize(delay
d390: 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s).  sqlite3 *db
d3a0: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
d3b0: 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d  r;.  int tmout =
d3c0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d3d0: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
d3e0: 72 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53 51  rior;..#ifdef SQ
d3f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
d400: 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66 28 20  K_TIMEOUT.  if( 
d410: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
d420: 74 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54  trol(pFile,SQLIT
d430: 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d  E_FCNTL_LOCK_TIM
d440: 45 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51  EOUT,&tmout)==SQ
d450: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
d460: 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20  f( count ){.    
d470: 20 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20    tmout = 0;.   
d480: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
d490: 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53  Control(pFile, S
d4a0: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
d4b0: 5f 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74  _TIMEOUT, &tmout
d4c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d4d0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
d4e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d4f0: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
d500: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d510: 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
d520: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
d530: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
d540: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
d550: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
d560: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
d570: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
d580: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
d590: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
d5a0: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
d5b0: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
d5c0: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
d5d0: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
d5e0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
d5f0: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d  ior + delay > tm
d600: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
d610: 20 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72   = tmout - prior
d620: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
d630: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d640: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
d650: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
d660: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
d670: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f  urn 1;.#else.  /
d680: 2a 20 54 68 69 73 20 63 61 73 65 20 66 6f 72 20  * This case for 
d690: 75 6e 69 78 20 73 79 73 74 65 6d 73 20 74 68 61  unix systems tha
d6a0: 74 20 6c 61 63 6b 20 75 73 6c 65 65 70 28 29 20  t lack usleep() 
d6b0: 73 75 70 70 6f 72 74 2e 20 20 53 6c 65 65 70 69  support.  Sleepi
d6c0: 6e 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  ng.  ** must be 
d6d0: 64 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e  done in incremen
d6e0: 74 73 20 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f  ts of whole seco
d6f0: 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nds */.  sqlite3
d700: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
d710: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f  *)ptr;.  int tmo
d720: 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a  ut = ((sqlite3 *
d730: 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f  )ptr)->busyTimeo
d740: 75 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ut;.  UNUSED_PAR
d750: 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a 20  AMETER(pFile);. 
d760: 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31   if( (count+1)*1
d770: 30 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20  000 > tmout ){. 
d780: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d790: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
d7a0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
d7b0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
d7c0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
d7d0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
d7e0: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
d7f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d800: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
d810: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
d820: 66 61 69 6c 65 64 20 74 6f 20 61 63 71 75 69 72  failed to acquir
d830: 65 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56  e a.** lock on V
d840: 46 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a  FS file pFile..*
d850: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
d860: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
d870: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
d880: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
d890: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
d8a0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
d8b0: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
d8c0: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
d8d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
d8e0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
d8f0: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c  (BusyHandler *p,
d900: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
d910: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  File){.  int rc;
d920: 0a 20 20 69 66 28 20 70 2d 3e 78 42 75 73 79 48  .  if( p->xBusyH
d930: 61 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e  andler==0 || p->
d940: 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e  nBusy<0 ) return
d950: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45 78   0;.  if( p->bEx
d960: 74 72 61 46 69 6c 65 41 72 67 20 29 7b 0a 20 20  traFileArg ){.  
d970: 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 78 74 72    /* Add an extr
d980: 61 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68  a parameter with
d990: 20 74 68 65 20 70 46 69 6c 65 20 70 6f 69 6e 74   the pFile point
d9a0: 65 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  er to the end of
d9b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   the.    ** call
d9c0: 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69  back argument li
d9d0: 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a  st */.    int (*
d9e0: 78 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xTra)(void*,int,
d9f0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
da00: 20 20 20 20 78 54 72 61 20 3d 20 28 69 6e 74 28      xTra = (int(
da10: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c  *)(void*,int,sql
da20: 69 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78  ite3_file*))p->x
da30: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
da40: 20 72 63 20 3d 20 78 54 72 61 28 70 2d 3e 70 42   rc = xTra(p->pB
da50: 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  usyArg, p->nBusy
da60: 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73  , pFile);.  }els
da70: 65 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63 79  e{.    /* Legacy
da80: 20 73 74 79 6c 65 20 62 75 73 79 20 68 61 6e 64   style busy hand
da90: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ler callback */.
daa0: 20 20 20 20 72 63 20 3d 20 70 2d 3e 78 42 75 73      rc = p->xBus
dab0: 79 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73  yHandler(p->pBus
dac0: 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b  yArg, p->nBusy);
dad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
dae0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
daf0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
db00: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
db10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
db20: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
db30: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
db40: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
db50: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
db60: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
db70: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
db80: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
db90: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
dba0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
dbb0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
dbc0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
dbd0: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
dbe0: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
dbf0: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
dc00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
dc10: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
dc20: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
dc30: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
dc40: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
dc50: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
dc60: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
dc70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
dc80: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78  b->busyHandler.x
dc90: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
dca0: 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  usy;.  db->busyH
dcb0: 61 6e 64 6c 65 72 2e 70 42 75 73 79 41 72 67 20  andler.pBusyArg 
dcc0: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
dcd0: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
dce0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
dcf0: 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c  andler.bExtraFil
dd00: 65 41 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eArg = 0;.  db->
dd10: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b  busyTimeout = 0;
dd20: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
dd30: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
dd40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dd50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
dd60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
dd70: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
dd80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
dd90: 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67  ne sets the prog
dda0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ress callback fo
ddb0: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
ddc0: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
ddd0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
dde0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
ddf0: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  given argument. 
de00: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
de10: 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65  lback will.** be
de20: 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e   invoked every n
de30: 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  Ops opcodes..*/.
de40: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f  void sqlite3_pro
de50: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20  gress_handler(. 
de60: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
de70: 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74   int nOps,.  int
de80: 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f   (*xProgress)(vo
de90: 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70  id*), .  void *p
dea0: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
deb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
dec0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
ded0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
dee0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
def0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
df00: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
df10: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
df20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
df30: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
df40: 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a    if( nOps>0 ){.
df50: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
df60: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
df70: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
df80: 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Ops = (unsigned)
df90: 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50  nOps;.    db->pP
dfa0: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
dfb0: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
dfc0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
dfd0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  0;.    db->nProg
dfe0: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
dff0: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
e000: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  g = 0;.  }.  sql
e010: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e020: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  (db->mutex);.}.#
e030: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
e040: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
e050: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
e060: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
e070: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
e080: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
e090: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
e0a0: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
e0b0: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
e0c0: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
e0d0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
e0e0: 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53  nt ms){.#ifdef S
e0f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e100: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e110: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e120: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
e130: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e140: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
e150: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c   ms>0 ){.    sql
e160: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
e170: 72 28 64 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f  r(db, (int(*)(vo
e180: 69 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65 44  id*,int))sqliteD
e190: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
e1a0: 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20   (void*)db);.   
e1d0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
e1e0: 20 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62   = ms;.    db->b
e1f0: 75 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72  usyHandler.bExtr
e200: 61 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20  aFileArg = 1;.  
e210: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e220: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
e230: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
e240: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e250: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
e260: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
e270: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
e280: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
e290: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
e2a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
e2b0: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
e2c0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
e2d0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e2e0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
e2f0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
e300: 64 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c  db) && (db==0 ||
e310: 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49   db->magic!=SQLI
e320: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29  TE_MAGIC_ZOMBIE)
e330: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e340: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e350: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
e360: 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75  }.#endif.  db->u
e370: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
e380: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
e390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e3a0: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
e3b0: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
e3c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
e3d0: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
e3e0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
e3f0: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
e400: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
e410: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
e420: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
e430: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
e440: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e450: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
e460: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
e470: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
e480: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
e490: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
e4a0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
e4b0: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
e4c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e4d0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
e4e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e4f0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
e500: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
e510: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e520: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e530: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e540: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e550: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e560: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e570: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e580: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e590: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
e5a0: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
e5b0: 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20  pDestructor.){. 
e5c0: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
e5d0: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  nt nName;.  int 
e5e0: 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61  extraFlags;..  a
e5f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e600: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
e610: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
e620: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
e630: 7c 0a 20 20 20 20 20 20 28 78 53 46 75 6e 63 20  |.      (xSFunc 
e640: 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53  && (xFinal || xS
e650: 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20  tep)) || .      
e660: 28 21 78 53 46 75 6e 63 20 26 26 20 28 78 46 69  (!xSFunc && (xFi
e670: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
e680: 7c 7c 0a 20 20 20 20 20 20 28 21 78 53 46 75 6e  ||.      (!xSFun
e690: 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26  c && (!xFinal &&
e6a0: 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20   xStep)) ||.    
e6b0: 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41    (nArg<-1 || nA
e6c0: 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  rg>SQLITE_MAX_FU
e6d0: 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20  NCTION_ARG) ||. 
e6e0: 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65       (255<(nName
e6f0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e700: 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  30( zFunctionNam
e710: 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  e))) ){.    retu
e720: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e730: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73  _BKPT;.  }..  as
e740: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
e750: 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49  C_CONSTANT==SQLI
e760: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
e770: 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73   );.  extraFlags
e780: 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45   = enc &  SQLITE
e790: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a  _DETERMINISTIC;.
e7a0: 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45    enc &= (SQLITE
e7b0: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51  _FUNC_ENCMASK|SQ
e7c0: 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69  LITE_ANY);.  .#i
e7d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e7e0: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20  T_UTF16.  /* If 
e7f0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
e800: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
e810: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
e820: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
e830: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
e840: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
e850: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
e860: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
e870: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
e880: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
e890: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
e8a0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
e8b0: 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45  *.  ** If SQLITE
e8c0: 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65  _ANY is specifie
e8d0: 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72  d, add three ver
e8e0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e  sions of the fun
e8f0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  ction.  ** to th
e900: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20  e hash table..  
e910: 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51  */.  if( enc==SQ
e920: 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20  LITE_UTF16 ){.  
e930: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
e940: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65  TF16NATIVE;.  }e
e950: 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  lse if( enc==SQL
e960: 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69  ITE_ANY ){.    i
e970: 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  nt rc;.    rc = 
e980: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
e990: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
e9a0: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
e9b0: 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67  E_UTF8|extraFlag
e9c0: 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65  s,.         pUse
e9d0: 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78  rData, xSFunc, x
e9e0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44  Step, xFinal, pD
e9f0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
ea00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ea10: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
ea20: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
ea30: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
ea40: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
ea50: 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46  E_UTF16LE|extraF
ea60: 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
ea70: 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e  pUserData, xSFun
ea80: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
ea90: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
eaa0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
eab0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
eac0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ead0: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
eae0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
eaf0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
eb00: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
eb10: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
eb20: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
eb30: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
eb40: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
eb50: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
eb60: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
eb70: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
eb80: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
eb90: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
eba0: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
ebb0: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
ebc0: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
ebd0: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
ebe0: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
ebf0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
ec00: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
ec10: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
ec20: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
ec30: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
ec40: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
ec50: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
ec60: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  ionName, nArg, (
ec70: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
ec80: 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46  ( p && (p->funcF
ec90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
eca0: 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63  NC_ENCMASK)==enc
ecb0: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
ecc0: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
ecd0: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
ece0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ecf0: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
ed00: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
ed10: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
ed20: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
ed30: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
ed40: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
ed50: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
ed60: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
ed70: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
ed80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ed90: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
eda0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
edb0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
edc0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ents(db);.    }.
edd0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
ede0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
edf0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
ee00: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
ee10: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
ee20: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
ee30: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
ee40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
ee50: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
ee60: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
ee70: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66  older version of
ee80: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
ee90: 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20  th a configured 
eea0: 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20  destructor is.  
eeb0: 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ** being replace
eec0: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  d invoke the des
eed0: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
eee0: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63   here. */.  func
eef0: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
ef00: 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74  p);..  if( pDest
ef10: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
ef20: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b  estructor->nRef+
ef30: 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70 44  +;.  }.  p->u.pD
ef40: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73  estructor = pDes
ef50: 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75  tructor;.  p->fu
ef60: 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75  ncFlags = (p->fu
ef70: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
ef80: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c  _FUNC_ENCMASK) |
ef90: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74   extraFlags;.  t
efa0: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63  estcase( p->func
efb0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  Flags & SQLITE_D
efc0: 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a  ETERMINISTIC );.
efd0: 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78 53    p->xSFunc = xS
efe0: 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a 20  Func ? xSFunc : 
eff0: 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e  xStep;.  p->xFin
f000: 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a  alize = xFinal;.
f010: 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d    p->pUserData =
f020: 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d   pUserData;.  p-
f030: 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72  >nArg = (u16)nAr
f040: 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
f050: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f060: 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20  Create new user 
f070: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  functions..*/.in
f080: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
f090: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
f0a0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
f0b0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
f0c0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
f0d0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
f0e0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63  .  void (*xSFunc
f0f0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
f100: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
f110: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
f120: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
f130: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
f140: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
f150: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
f160: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
f170: 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  xt*).){.  return
f180: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
f190: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
f1a0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
f1b0: 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  , p, xSFunc, xSt
f1c0: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
f1f0: 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  0);.}..int sqlit
f200: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f210: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
f220: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
f230: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
f240: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
f250: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
f260: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
f270: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f280: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f290: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
f2a0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
f2b0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
f2c0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
f2d0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
f2e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
f2f0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
f300: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
f310: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f320: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
f330: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
f340: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
f350: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f360: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f370: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f380: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
f390: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
f3a0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
f3b0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f3c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f3d0: 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72  x);.  if( xDestr
f3e0: 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d  oy ){.    pArg =
f3f0: 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72   (FuncDestructor
f400: 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
f410: 28 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74  (sizeof(FuncDest
f420: 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66  ructor));.    if
f430: 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20  ( !pArg ){.     
f440: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
f450: 28 64 62 29 3b 0a 20 20 20 20 20 20 78 44 65 73  (db);.      xDes
f460: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67  troy(p);.      g
f470: 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  oto out;.    }. 
f480: 20 20 20 70 41 72 67 2d 3e 6e 52 65 66 20 3d 20     pArg->nRef = 
f490: 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65  0;.    pArg->xDe
f4a0: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
f4b0: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
f4c0: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
f4d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
f4e0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
f4f0: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
f500: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20   xSFunc, xStep, 
f510: 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20  xFinal, pArg);. 
f520: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
f530: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
f540: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f550: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78  LITE_OK );.    x
f560: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
f570: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72  sqlite3_free(pAr
f580: 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20  g);.  }.. out:. 
f590: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
f5a0: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
f5b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f5c0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f5d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f5e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f5f0: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
f600: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
f610: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
f620: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
f630: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
f640: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
f650: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
f660: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
f670: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
f680: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
f690: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
f6a0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
f6b0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
f6c0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
f6d0: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
f6e0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
f6f0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
f700: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
f710: 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64  r *zFunc8;..#ifd
f720: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f730: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
f740: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f750: 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46  heckOk(db) || zF
f760: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29  unctionName==0 )
f770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
f780: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
f790: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f7a0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f7b0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
f7c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f7d0: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
f7e0: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
f7f0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
f800: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
f810: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
f820: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
f830: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
f840: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
f850: 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c  p, xSFunc,xStep,
f860: 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c  xFinal,0);.  sql
f870: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f880: 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73  Func8);.  rc = s
f890: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
f8a0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
f8b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f8c0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f8d0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
f8e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
f8f0: 77 69 6e 67 20 69 73 20 74 68 65 20 69 6d 70 6c  wing is the impl
f900: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e  ementation of an
f910: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68   SQL function th
f920: 61 74 20 61 6c 77 61 79 73 0a 2a 2a 20 66 61 69  at always.** fai
f930: 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ls with an error
f940: 20 6d 65 73 73 61 67 65 20 73 74 61 74 69 6e 67   message stating
f950: 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
f960: 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 74 68  on is used in th
f970: 65 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f 6e 74 65  e.** wrong conte
f980: 78 74 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  xt.  The sqlite3
f990: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
f9a0: 6f 6e 28 29 20 41 50 49 20 6d 69 67 68 74 20 63  on() API might c
f9b0: 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 53 51 4c 20  onstruct.** SQL 
f9c0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73  function that us
f9d0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
f9e0: 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
f9f0: 69 6f 6e 73 20 77 69 6c 6c 20 65 78 69 73 74 0a  ions will exist.
fa00: 2a 2a 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f  ** for name reso
fa10: 6c 75 74 69 6f 6e 20 62 75 74 20 61 72 65 20 61  lution but are a
fa20: 63 74 75 61 6c 6c 79 20 6f 76 65 72 6c 6f 61 64  ctually overload
fa30: 65 64 20 62 79 20 74 68 65 20 78 46 69 6e 64 46  ed by the xFindF
fa40: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65 74 68 6f  unction.** metho
fa50: 64 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62  d of virtual tab
fa60: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
fa70: 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 76 61 6c  oid sqlite3Inval
fa80: 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  idFunction(.  sq
fa90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
faa0: 6f 6e 74 65 78 74 2c 20 20 2f 2a 20 54 68 65 20  ontext,  /* The 
fab0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 69 6e 67  function calling
fac0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
fad0: 74 20 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  t NotUsed,      
fae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
faf0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
fb00: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
fb10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
fb20: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 20 20 20  ue **NotUsed2   
fb30: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65 61 63 68  /* Value of each
fb40: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
fb50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
fb60: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
fb70: 72 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  r*)sqlite3_user_
fb80: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20  data(context);. 
fb90: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
fba0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
fbb0: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
fbc0: 64 32 29 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71  d2);.  zErr = sq
fbd0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
fbe0: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
fbf0: 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 25 73 20  use function %s 
fc00: 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
fc10: 20 63 6f 6e 74 65 78 74 22 2c 20 7a 4e 61 6d 65   context", zName
fc20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
fc30: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
fc40: 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20  t, zErr, -1);.  
fc50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
fc60: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  r);.}../*.** Dec
fc70: 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  lare that a func
fc80: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  tion has been ov
fc90: 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69  erloaded by a vi
fca0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
fcb0: 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
fcc0: 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  on already exist
fcd0: 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67  s as a regular g
fce0: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20  lobal function, 
fcf0: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
fd00: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
fd10: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
fd20: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
fd30: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a  , then create.**
fd40: 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20   a new one that 
fd50: 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20  always throws a 
fd60: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20  run-time error. 
fd70: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72   .**.** When vir
fd80: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65  tual tables inte
fd90: 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  nd to provide an
fda0: 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
fdb0: 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68  tion, they.** sh
fdc0: 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72  ould call this r
fdd0: 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73  outine to make s
fde0: 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66  ure the global f
fdf0: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a  unction exists..
fe00: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ** A global func
fe10: 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20  tion must exist 
fe20: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d  in order for nam
fe30: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  e resolution to 
fe40: 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79  work.** properly
fe50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fe60: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
fe70: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
fe80: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
fe90: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  *zName,.  int nA
fea0: 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  rg.){.  int rc;.
feb0: 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a 0a    char *zCopy;..
fec0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
fed0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
fee0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
fef0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
ff00: 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41  | zName==0 || nA
ff10: 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74  rg<-2 ){.    ret
ff20: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
ff30: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
ff40: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
ff50: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ff60: 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ex);.  rc = sqli
ff70: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
ff80: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
ff90: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
ffa0: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  !=0;.  sqlite3_m
ffb0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ffc0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72 63 20  utex);.  if( rc 
ffd0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ffe0: 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d 20 73 71  OK;.  zCopy = sq
fff0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 4e  lite3_mprintf(zN
10000 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 70  ame);.  if( zCop
10010 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
10020 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 65  LITE_NOMEM;.  re
10030 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
10040 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
10050 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
10060 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 2c 20           zCopy, 
10090 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
100a0 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 73 71  nction, 0, 0, sq
100b0 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a  lite3_free);.}..
100c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
100d0 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
100e0 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
100f0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
10100 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
10110 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
10120 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
10130 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
10140 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
10150 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
10160 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
10170 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
10180 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
10190 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
101a0 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
101b0 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
101c0 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
101d0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
101e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
101f0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
10200 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  TED.void *sqlite
10210 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20  3_trace(sqlite3 
10220 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54 72 61 63  *db, void(*xTrac
10230 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
10240 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
10250 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
10260 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10270 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10280 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10290 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
102a0 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
102b0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
102c0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
102d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
102e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
102f0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10300 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63  pOld = db->pTrac
10310 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72 61  eArg;.  db->mTra
10320 63 65 20 3d 20 78 54 72 61 63 65 20 3f 20 53 51  ce = xTrace ? SQ
10330 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45 47 41 43  LITE_TRACE_LEGAC
10340 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54 72  Y : 0;.  db->xTr
10350 61 63 65 20 3d 20 28 69 6e 74 28 2a 29 28 75 33  ace = (int(*)(u3
10360 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f  2,void*,void*,vo
10370 69 64 2a 29 29 78 54 72 61 63 65 3b 0a 20 20 64  id*))xTrace;.  d
10380 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
10390 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
103a0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
103b0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
103c0 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
103d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
103e0 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a 20  PRECATED */../* 
103f0 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
10400 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20   callback using 
10410 74 68 65 20 76 65 72 73 69 6f 6e 2d 32 20 69 6e  the version-2 in
10420 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
10430 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32  sqlite3_trace_v2
10440 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10470 2a 20 54 72 61 63 65 20 74 68 69 73 20 63 6f 6e  * Trace this con
10480 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73  nection */.  uns
10490 69 67 6e 65 64 20 6d 54 72 61 63 65 2c 20 20 20  igned mTrace,   
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
104c0 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 62 65 20  of events to be 
104d0 74 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74 28  traced */.  int(
104e0 2a 78 54 72 61 63 65 29 28 75 6e 73 69 67 6e 65  *xTrace)(unsigne
104f0 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f  d,void*,void*,vo
10500 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62 61  id*),  /* Callba
10510 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f 0a  ck to invoke */.
10520 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10550 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23 69  Context */.){.#i
10560 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10570 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
10580 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10590 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
105a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
105b0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
105c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
105d0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
105e0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
105f0 28 20 6d 54 72 61 63 65 3d 3d 30 20 29 20 78 54  ( mTrace==0 ) xT
10600 72 61 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  race = 0;.  if( 
10610 78 54 72 61 63 65 3d 3d 30 20 29 20 6d 54 72 61  xTrace==0 ) mTra
10620 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 54  ce = 0;.  db->mT
10630 72 61 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a 20  race = mTrace;. 
10640 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54   db->xTrace = xT
10650 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61  race;.  db->pTra
10660 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ceArg = pArg;.  
10670 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10680 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
10690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
106a0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
106b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
106c0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67 69  CATED./*.** Regi
106d0 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66  ster a profile f
106e0 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
106f0 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
10700 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
10710 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75  d .** profile fu
10720 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  nction is return
10730 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
10740 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  LL profile funct
10750 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
10760 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65  o profiling is e
10770 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
10780 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  NULL.** profile 
10790 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
107a0 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
107b0 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
107c0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a  e conclusion of.
107d0 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ** each SQL stat
107e0 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75  ement that is ru
107f0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
10800 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73  te3_profile(.  s
10810 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
10820 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76  id (*xProfile)(v
10830 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
10840 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c  ,sqlite_uint64),
10850 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
10860 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a  .  void *pOld;..
10870 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10880 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
10890 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
108a0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
108b0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
108c0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
108d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
108e0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
108f0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10900 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
10910 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
10920 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
10930 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
10940 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
10950 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
10960 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10970 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10980 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
10990 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
109a0 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f  IT_DEPRECATED */
109b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
109c0 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
109d0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
109e0 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  a function to be
109f0 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20   invoked when a 
10a00 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
10a10 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  its..** If the i
10a20 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
10a30 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
10a40 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
10a50 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
10a60 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
10a70 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
10a80 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
10a90 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10aa0 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
10ab0 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
10ac0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
10ad0 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
10ae0 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
10af0 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
10b00 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
10b10 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
10b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
10b30 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
10b40 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
10b50 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
10b60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10b70 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10b80 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10b90 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
10ba0 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
10bb0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
10bc0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
10bd0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
10be0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10bf0 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
10c00 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
10c10 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
10c20 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
10c30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
10c40 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
10c50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10c60 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10c70 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
10c80 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
10c90 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
10ca0 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
10cb0 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
10cc0 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
10cd0 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
10ce0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
10cf0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
10d00 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
10d10 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
10d20 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10d30 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
10d40 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
10d50 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
10d60 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
10d70 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
10d80 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
10d90 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
10da0 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10dc0 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
10dd0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
10de0 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
10df0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10e00 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10e10 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10e20 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
10e30 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
10e40 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
10e50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10e60 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10e70 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10e80 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
10e90 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72   = db->pUpdateAr
10ea0 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65  g;.  db->xUpdate
10eb0 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
10ec0 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64  back;.  db->pUpd
10ed0 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
10ee0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10ef0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10f00 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
10f10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
10f20 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
10f30 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
10f40 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
10f50 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20  on is rolled.** 
10f60 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74  back by this dat
10f70 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10f80 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
10f90 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
10fa0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10fc0 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
10fd0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
10fe0 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
10ff0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
11000 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
11010 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
11020 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
11030 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
11040 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
11050 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
11060 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Ret;..#ifdef SQL
11070 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
11080 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
11090 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
110a0 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
110b0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
110c0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
110d0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
110e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
110f0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11100 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52  .  pRet = db->pR
11110 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62  ollbackArg;.  db
11120 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
11130 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
11140 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  .  db->pRollback
11150 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
11160 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11170 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
11180 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
11190 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
111a0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
111b0 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  OOK./*.** Regist
111c0 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
111d0 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
111e0 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
111f0 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
11200 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
11210 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
11220 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
11230 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
11240 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  preupdate_hook(.
11250 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11270 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
11280 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
11290 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c  */.  void(*xCall
112a0 62 61 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f  back)(         /
112b0 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
112c0 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a  ion */.    void*
112d0 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68  ,sqlite3*,int,ch
112e0 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63  ar const*,char c
112f0 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e  onst*,sqlite3_in
11300 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  t64,sqlite3_int6
11310 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63  /* First callbac
11340 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  k argument */.){
11350 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
11360 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11370 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11380 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50  .  pRet = db->pP
11390 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  reUpdateArg;.  d
113a0 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
113b0 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
113c0 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  k;.  db->pPreUpd
113d0 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
113e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
113f0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
11400 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
11410 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11420 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
11430 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66  ATE_HOOK */..#if
11440 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11450 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  _WAL./*.** The s
11460 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
11470 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  ) callback regis
11480 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  tered by sqlite3
11490 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
114a0 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  int()..** Invoke
114b0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
114c0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e  ckpoint if the n
114d0 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
114e0 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a  in the log file.
114f0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
11500 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41  an sqlite3.pWalA
11510 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e  rg cast to an in
11520 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65  teger (the value
11530 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a   configured by.*
11540 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  * wal_autocheckp
11550 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74  oint())..*/ .int
11560 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
11570 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a  ltHook(.  void *
11580 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20  pClientData,    
11590 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a   /* Argument */.
115a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
115b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
115c0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
115d0 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
115e0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a     /* Database *
115f0 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20  /.  int nFrame  
11600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11610 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a  ze of WAL */.){.
11620 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51    if( nFrame>=SQ
11630 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
11640 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a  pClientData) ){.
11650 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11660 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11670 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
11680 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
11690 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
116a0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
116b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
116c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
116d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
116e0 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
116f0 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71   Configure an sq
11700 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
11710 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
11720 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
11730 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62  point.** a datab
11740 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74  ase after commit
11750 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
11760 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
11770 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72  nFrame or.** mor
11780 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  e frames in the 
11790 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e  log file. Passin
117a0 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61  g zero or a nega
117b0 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68  tive value as th
117c0 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61  e.** nFrame para
117d0 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61  meter disables a
117e0 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
117f0 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  ints entirely..*
11800 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
11810 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
11820 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
11830 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74  places any exist
11840 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ing callback.** 
11850 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  registered using
11860 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
11870 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72  k(). Likewise, r
11880 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c  egistering a cal
11890 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73  lback.** using s
118a0 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
118b0 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  ) disables the a
118c0 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
118d0 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  int mechanism.**
118e0 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
118f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
11900 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
11910 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
11920 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
11930 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66   nFrame){.#ifdef
11940 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11950 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11960 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
11970 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61  D_PARAMETER(nFra
11980 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65  me);.#else.#ifde
11990 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
119a0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
119b0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
119c0 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
119d0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
119e0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
119f0 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a  if( nFrame>0 ){.
11a00 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
11a10 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33  hook(db, sqlite3
11a20 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20  WalDefaultHook, 
11a30 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
11a40 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65  R(nFrame));.  }e
11a50 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
11a60 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c  _wal_hook(db, 0,
11a70 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
11a80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
11aa0 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
11ab0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
11ac0 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
11ad0 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65  action is writte
11ae0 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72  n.** into the wr
11af0 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79  ite-ahead-log by
11b00 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
11b10 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
11b20 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f  id *sqlite3_wal_
11b30 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
11b40 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
11b50 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
11b60 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
11b70 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  is db handle */.
11b80 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
11b90 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65  )(void *, sqlite
11ba0 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
11bb0 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70   int),.  void *p
11bc0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
11bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
11be0 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
11bf0 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  d to xCallback()
11c00 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
11c10 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
11c20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66   void *pRet;.#if
11c30 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11c40 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
11c50 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
11c60 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
11c70 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
11c80 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
11c90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
11ca0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
11cb0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
11cc0 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
11cd0 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20   db->pWalArg;.  
11ce0 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
11cf0 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
11d00 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41  db->pWalArg = pA
11d10 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11d20 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11d30 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11d40 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  Ret;.#else.  ret
11d50 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
11d60 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
11d70 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a  t database zDb..
11d80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
11d90 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
11da0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11dd0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
11de0 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
11df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11e00 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20  ame of attached 
11e10 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c  database (or NUL
11e20 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64  L) */.  int eMod
11e30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11e40 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
11e50 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76  E_CHECKPOINT_* v
11e60 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
11e70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20  nLog,           
11e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
11e90 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f  : Size of WAL lo
11ea0 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20  g in frames */. 
11eb0 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20   int *pnCkpt    
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e   /* OUT: Total n
11ee0 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
11ef0 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a  checkpointed */.
11f00 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
11f10 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75  _OMIT_WAL.  retu
11f20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
11f30 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  lse.  int rc;   
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11f60 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  code */.  int iD
11f70 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  b = SQLITE_MAX_A
11f80 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c  TTACHED;  /* sql
11f90 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78  ite3.aDb[] index
11fa0 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70   of db to checkp
11fb0 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  oint */..#ifdef 
11fc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
11fd0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
11fe0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
11ff0 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
12000 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
12010 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  KPT;.#endif..  /
12020 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
12030 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
12040 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20  s to -1 in case 
12050 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
12060 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20   */.  if( pnLog 
12070 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20  ) *pnLog = -1;. 
12080 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70   if( pnCkpt ) *p
12090 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61  nCkpt = -1;..  a
120a0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
120b0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
120c0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
120d0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
120e0 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
120f0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
12100 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
12110 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  T==2 );.  assert
12120 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
12130 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20  INT_TRUNCATE==3 
12140 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
12150 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
12160 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
12170 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
12180 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  INT_TRUNCATE ){.
12190 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
121a0 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38  OF: R-03996-1208
121b0 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65  8 The M paramete
121c0 72 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69  r must be a vali
121d0 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20  d checkpoint.   
121e0 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20   ** mode: */.   
121f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
12200 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  ISUSE;.  }..  sq
12210 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12220 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
12230 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30  if( zDb && zDb[0
12240 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73  ] ){.    iDb = s
12250 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
12260 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  (db, zDb);.  }. 
12270 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
12280 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
12290 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
122a0 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
122b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22   SQLITE_ERROR, "
122c0 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
122d0 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  : %s", zDb);.  }
122e0 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75  else{.    db->bu
122f0 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
12300 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
12310 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
12320 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20  db, iDb, eMode, 
12330 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
12340 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12350 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
12360 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
12370 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20  xit(db, rc);..  
12380 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
12390 6e 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  no active statem
123a0 65 6e 74 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ents, clear the 
123b0 69 6e 74 65 72 72 75 70 74 20 66 6c 61 67 20 61  interrupt flag a
123c0 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
123d0 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  t.  */.  if( db-
123e0 3e 6e 56 64 62 65 41 63 74 69 76 65 3d 3d 30 20  >nVdbeActive==0 
123f0 29 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e 69 73  ){.    db->u1.is
12400 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 30 3b  Interrupted = 0;
12410 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
12420 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
12430 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
12440 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
12450 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
12460 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49   database zDb. I
12470 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f  f zDb is NULL, o
12480 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  r if the buffer 
12490 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zDb points.** to
124a0 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f   contains a zero
124b0 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20  -length string, 
124c0 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
124d0 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63  abases are .** c
124e0 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a  heckpointed..*/.
124f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
12500 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
12510 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
12520 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45  ar *zDb){.  /* E
12530 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31  VIDENCE-OF: R-41
12540 36 31 33 2d 32 30 35 35 33 20 54 68 65 20 73 71  613-20553 The sq
12550 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
12560 6f 69 6e 74 28 44 2c 58 29 20 69 73 20 65 71 75  oint(D,X) is equ
12570 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  ivalent to.  ** 
12580 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
12590 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51  kpoint_v2(D,X,SQ
125a0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
125b0 50 41 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f  PASSIVE,0,0). */
125c0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
125d0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
125e0 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54  _v2(db,zDb,SQLIT
125f0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
12600 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69  SIVE,0,0);.}..#i
12610 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12620 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  T_WAL./*.** Run 
12630 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20  a checkpoint on 
12640 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68  database iDb. Th
12650 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
12660 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73   database iDb is
12670 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  .** not currentl
12680 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  y open in WAL mo
12690 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  de..**.** If a t
126a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
126b0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
126c0 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  se being checkpo
126d0 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20  inted, this .** 
126e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
126f0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61   SQLITE_LOCKED a
12700 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  nd a checkpoint 
12710 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
12720 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
12730 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
12740 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b  unning the check
12750 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65  point, an SQLite
12760 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
12770 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65  ** returned (i.e
12780 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e  . SQLITE_IOERR).
12790 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
127a0 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
127b0 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
127c0 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f  se handle db sho
127d0 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74  uld be held by t
127e0 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d  he caller. The m
127f0 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74  utex.** associat
12800 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
12810 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e  ific b-tree bein
12820 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69  g checkpointed i
12830 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68  s taken by.** th
12840 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  is function whil
12850 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
12860 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a   is running..**.
12870 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73  ** If iDb is pas
12880 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  sed SQLITE_MAX_A
12890 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c  TTACHED, then al
128a0 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
128b0 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63  ases are.** chec
128c0 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20  kpointed. If an 
128d0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
128e0 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72  ered it is retur
128f0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ned immediately 
12900 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20  -.** no attempt 
12910 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b  is made to check
12920 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e  point any remain
12930 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ing databases..*
12940 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
12950 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53  Mode is one of S
12960 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
12970 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 2c 20  _PASSIVE, FULL, 
12980 52 45 53 54 41 52 54 0a 2a 2a 20 6f 72 20 54 52  RESTART.** or TR
12990 55 4e 43 41 54 45 2e 0a 2a 2f 0a 69 6e 74 20 73  UNCATE..*/.int s
129a0 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
129b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
129c0 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65  t iDb, int eMode
129d0 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e  , int *pnLog, in
129e0 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e  t *pnCkpt){.  in
129f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12a00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12a10 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
12a20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
12a50 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74  rate through att
12a60 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69  ached dbs */.  i
12a70 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20  nt bBusy = 0;   
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12a90 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45  * True if SQLITE
12aa0 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65  _BUSY has been e
12ab0 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20  ncountered */.. 
12ac0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12ad0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
12ae0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
12af0 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70  rt( !pnLog || *p
12b00 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73  nLog==-1 );.  as
12b10 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c  sert( !pnCkpt ||
12b20 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a   *pnCkpt==-1 );.
12b30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
12b40 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c  ->nDb && rc==SQL
12b50 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
12b60 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20    if( i==iDb || 
12b70 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  iDb==SQLITE_MAX_
12b80 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20  ATTACHED ){.    
12b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12ba0 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  reeCheckpoint(db
12bb0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d  ->aDb[i].pBt, eM
12bc0 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
12bd0 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67  pt);.      pnLog
12be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b   = 0;.      pnCk
12bf0 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  pt = 0;.      if
12c00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
12c10 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75  Y ){.        bBu
12c20 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sy = 1;.        
12c30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12c40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12c50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
12c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42  =SQLITE_OK && bB
12c70 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55  usy) ? SQLITE_BU
12c80 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  SY : rc;.}.#endi
12c90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12ca0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  _WAL */../*.** T
12cb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
12cc0 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69  urns true if mai
12cd0 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20  n-memory should 
12ce0 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
12cf0 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  of.** a temporar
12d00 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73  y file for trans
12d10 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73  ient pager files
12d20 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a   and statement j
12d30 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20  ournals..** The 
12d40 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64  value returned d
12d50 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
12d60 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f  lue of db->temp_
12d70 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a  store (runtime.*
12d80 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64  * parameter) and
12d90 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d   the compile tim
12da0 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
12db0 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68  E_TEMP_STORE. Th
12dc0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  e.** following t
12dd0 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
12de0 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
12df0 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77  between these tw
12e00 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20  o values.** and 
12e10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72  this functions r
12e20 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  eturn value..**.
12e30 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50  **   SQLITE_TEMP
12e40 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74  _STORE     db->t
12e50 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f  emp_store     Lo
12e60 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72  cation of tempor
12e70 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
12e80 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
12e90 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
12ea0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
12ef0 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
12f00 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
12f10 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
12f20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
12f30 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
12f40 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
12f50 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
12f60 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
12f80 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
12f90 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  1).**   1       
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fc0 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
12fd0 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ff0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
13000 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
13010 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
13040 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
13050 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
13060 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
13070 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
13080 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
13090 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
130a0 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20  *   3           
130b0 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
130d0 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
130e0 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
130f0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e  TempInMemory(con
13100 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  st sqlite3 *db){
13110 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
13120 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75  _STORE==1.  retu
13130 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
13140 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ore==2 );.#endif
13150 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
13160 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75  _STORE==2.  retu
13170 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
13180 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66  ore!=1 );.#endif
13190 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
131a0 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53  _STORE==3.  UNUS
131b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
131c0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
131d0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
131e0 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20  TEMP_STORE<1 || 
131f0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
13200 45 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E>3.  UNUSED_PAR
13210 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
13220 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
13230 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  ../*.** Return U
13240 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67  TF-8 encoded Eng
13250 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
13260 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
13270 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
13280 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
13290 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
132a0 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62  rmsg(sqlite3 *db
132b0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
132c0 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
132d0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
132e0 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
132f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
13300 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
13310 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
13320 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
13330 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
13340 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
13350 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73  E_BKPT);.  }.  s
13360 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13370 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
13380 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13390 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
133a0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
133b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
133c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
133d0 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45  testcase( db->pE
133e0 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d  rr==0 );.    z =
133f0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
13400 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
13410 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
13420 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
13430 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
13440 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
13450 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
13460 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
13470 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13480 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
13490 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
134a0 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
134b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
134c0 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
134d0 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
134e0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
134f0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
13500 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
13510 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
13520 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
13530 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
13540 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
13550 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
13560 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
13570 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
13580 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
13590 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
135a0 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
135b0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
135c0 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
135d0 3d 20 7b 0a 20 20 20 20 27 62 27 2c 20 27 61 27  = {.    'b', 'a'
135e0 2c 20 27 64 27 2c 20 27 20 27 2c 20 27 70 27 2c  , 'd', ' ', 'p',
135f0 20 27 61 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'a', 'r', 'a', 
13600 27 6d 27 2c 20 27 65 27 2c 20 27 74 27 2c 20 27  'm', 'e', 't', '
13610 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 0a 20 20  e', 'r', ' ',.  
13620 20 20 27 6f 27 2c 20 27 72 27 2c 20 27 20 27 2c    'o', 'r', ' ',
13630 20 27 6f 27 2c 20 27 74 27 2c 20 27 68 27 2c 20   'o', 't', 'h', 
13640 27 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27  'e', 'r', ' ', '
13650 41 27 2c 20 27 50 27 2c 20 27 49 27 2c 20 27 20  A', 'P', 'I', ' 
13660 27 2c 0a 20 20 20 20 27 6d 27 2c 20 27 69 27 2c  ',.    'm', 'i',
13670 20 27 73 27 2c 20 27 75 27 2c 20 27 73 27 2c 20   's', 'u', 's', 
13680 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63  'e', 0.  };..  c
13690 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20  onst void *z;.  
136a0 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
136b0 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75  eturn (void *)ou
136c0 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  tOfMem;.  }.  if
136d0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
136e0 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
136f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13700 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a  (void *)misuse;.
13710 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
13720 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
13730 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
13740 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13750 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29      z = (void *)
13760 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73  outOfMem;.  }els
13770 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
13780 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
13790 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69  db->pErr);.    i
137a0 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
137b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
137c0 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72  hMsg(db, db->err
137d0 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72  Code, sqlite3Err
137e0 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
137f0 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  );.      z = sql
13800 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
13810 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
13820 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c   }.    /* A mall
13830 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61  oc() may have fa
13840 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  iled within the 
13850 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
13860 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20  value_text16(). 
13870 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20     ** above. If 
13880 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
13890 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d  , then the db->m
138a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
138b0 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
138c0 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
138d0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f  re returning. Do
138e0 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20   this directly, 
138f0 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20  instead of via. 
13900 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69     ** sqlite3Api
13910 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64  Exit(), to avoid
13920 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74   setting the dat
13930 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72  abase handle err
13940 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20  or message..    
13950 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  */.    sqlite3Oo
13960 6d 43 6c 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a  mClear(db);.  }.
13970 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13980 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
13990 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
139a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
139b0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
139c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
139d0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
139e0 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
139f0 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
13a00 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
13a10 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
13a20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
13a30 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
13a40 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
13a50 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
13a60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13a70 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
13a80 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
13a90 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
13aa0 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
13ab0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
13ac0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
13ad0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
13ae0 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
13af0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
13b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13b10 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
13b20 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
13b30 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
13b40 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  }.int sqlite3_ex
13b50 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73  tended_errcode(s
13b60 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
13b70 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
13b80 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
13b90 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
13ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
13bb0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
13bc0 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
13bd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13be0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13bf0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13c00 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
13c10 72 72 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71  rrCode;.}.int sq
13c20 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72  lite3_system_err
13c30 6e 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  no(sqlite3 *db){
13c40 0a 20 20 72 65 74 75 72 6e 20 64 62 20 3f 20 64  .  return db ? d
13c50 62 2d 3e 69 53 79 73 45 72 72 6e 6f 20 3a 20 30  b->iSysErrno : 0
13c60 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ;.}  ../*.** Ret
13c70 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
13c80 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
13c90 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
13ca0 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
13cb0 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72  * argument.  For
13cc0 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c   now, this simpl
13cd0 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65  y calls the inte
13ce0 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53  rnal sqlite3ErrS
13cf0 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  tr().** function
13d00 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
13d10 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28  *sqlite3_errstr(
13d20 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72  int rc){.  retur
13d30 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
13d40 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  rc);.}../*.** Cr
13d50 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61  eate a new colla
13d60 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
13d70 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e  r database "db".
13d80 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e    The name is zN
13d90 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65  ame.** and the e
13da0 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a  ncoding is enc..
13db0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
13dc0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eateCollation(. 
13dd0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20   sqlite3* db,.  
13de0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
13df0 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  e, .  u8 enc,.  
13e00 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
13e10 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
13e20 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
13e30 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
13e40 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
13e50 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43  l)(void*).){.  C
13e60 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
13e70 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20   int enc2;.  .  
13e80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13e90 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
13ea0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
13eb0 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
13ec0 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
13ed0 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
13ee0 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
13ef0 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
13f00 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
13f10 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
13f20 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
13f30 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
13f40 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
13f50 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
13f60 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
13f70 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63   */.  enc2 = enc
13f80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
13f90 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
13fa0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
13fb0 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
13fc0 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20  16_ALIGNED );.  
13fd0 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  if( enc2==SQLITE
13fe0 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d  _UTF16 || enc2==
13ff0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
14000 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32  GNED ){.    enc2
14010 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
14020 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28  ATIVE;.  }.  if(
14030 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46   enc2<SQLITE_UTF
14040 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45  8 || enc2>SQLITE
14050 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20  _UTF16BE ){.    
14060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
14070 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
14080 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
14090 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76  is call is remov
140a0 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67  ing or replacing
140b0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c   an existing col
140c0 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71  lation .  ** seq
140d0 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e  uence. If so, an
140e0 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
140f0 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62  ve VMs, return b
14100 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20  usy. If there.  
14110 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
14120 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65   VMs, invalidate
14130 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65   any pre-compile
14140 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
14150 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  */.  pColl = sql
14160 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
14170 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
14180 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ame, 0);.  if( p
14190 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
141a0 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Cmp ){.    if( d
141b0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
141c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
141d0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
141e0 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
141f0 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
14200 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63   delete/modify c
14210 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14220 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  e due to active 
14230 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
14240 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14250 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
14260 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
14270 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
14280 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  s(db);..    /* I
14290 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
142a0 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
142b0 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
142c0 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
142d0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
142e0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
142f0 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
14300 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
14310 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
14320 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
14330 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
14340 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
14350 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
14360 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
14370 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
14380 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
14390 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
143a0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
143b0 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
143c0 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
143d0 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
143e0 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
143f0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
14400 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
14410 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
14420 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b  CollSeq, zName);
14430 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
14440 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
14450 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
14460 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
14470 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
14480 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
14490 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
144a0 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
144b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
144c0 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
144d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
144e0 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
144f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
14500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14510 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
14520 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
14530 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
14540 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
14550 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
14560 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14570 54 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  T;.  pColl->xCmp
14580 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70   = xCompare;.  p
14590 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43  Coll->pUser = pC
145a0 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65  tx;.  pColl->xDe
145b0 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c  l = xDel;.  pCol
145c0 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e  l->enc = (u8)(en
145d0 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49  c2 | (enc & SQLI
145e0 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
145f0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  ));.  sqlite3Err
14600 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
14610 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14620 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
14630 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
14640 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
14650 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
14660 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
14670 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
14680 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
14690 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
146a0 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
146b0 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
146c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
146d0 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
146e0 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
146f0 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
14700 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
14710 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
14720 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
14730 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
14740 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
14750 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
14760 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
14770 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
14780 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
14790 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
147a0 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
147b0 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
147c0 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
147d0 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
147e0 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a  _NUMBER,      /*
147f0 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32   IMP: R-38091-32
14800 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f  352 */.  SQLITE_
14810 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
14820 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
14830 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a  WORKER_THREADS,.
14840 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
14850 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d  ure the hard lim
14860 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72  its are set to r
14870 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73  easonable values
14880 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
14890 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  AX_LENGTH<100.# 
148a0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
148b0 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
148c0 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
148d0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
148e0 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30  AX_SQL_LENGTH<10
148f0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
14900 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
14910 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
14920 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
14930 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
14940 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58  ENGTH>SQLITE_MAX
14950 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20  _LENGTH.# error 
14960 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
14970 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62  ENGTH must not b
14980 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  e greater than S
14990 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
149a0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
149b0 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
149c0 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72  SELECT<2.# error
149d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
149e0 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74  OUND_SELECT must
149f0 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23   be at least 2.#
14a00 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
14a10 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a  _MAX_VDBE_OP<40.
14a20 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
14a30 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20  AX_VDBE_OP must 
14a40 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23  be at least 40.#
14a50 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
14a60 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
14a70 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  G<0 || SQLITE_MA
14a80 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31  X_FUNCTION_ARG>1
14a90 32 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  27.# error SQLIT
14aa0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
14ab0 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  RG must be betwe
14ac0 65 6e 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e  en 0 and 127.#en
14ad0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
14ae0 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c  AX_ATTACHED<0 ||
14af0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
14b00 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72  CHED>125.# error
14b10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
14b20 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74  CHED must be bet
14b30 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23  ween 0 and 125.#
14b40 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
14b50 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
14b60 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72  N_LENGTH<1.# err
14b70 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  or SQLITE_MAX_LI
14b80 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
14b90 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
14ba0 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
14bb0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
14bc0 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20  N>32767.# error 
14bd0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
14be0 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65  N must not excee
14bf0 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23  d 32767.#endif.#
14c00 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  if SQLITE_MAX_TR
14c10 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20  IGGER_DEPTH<1.# 
14c20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
14c30 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d  _TRIGGER_DEPTH m
14c40 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
14c50 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
14c60 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
14c70 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49  HREADS<0 || SQLI
14c80 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
14c90 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72  READS>50.# error
14ca0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
14cb0 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20  ER_THREADS must 
14cc0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
14cd0 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   50.#endif.../*.
14ce0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
14cf0 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20  lue of a limit. 
14d00 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   Report the old 
14d10 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20  value..** If an 
14d20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e  invalid limit in
14d30 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c  dex is supplied,
14d40 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d   report -1..** M
14d50 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62  ake no changes b
14d60 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20  ut still report 
14d70 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66  the old value if
14d80 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69   the.** new limi
14d90 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a  t is negative..*
14da0 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72  *.** A new lower
14db0 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20   limit does not 
14dc0 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20  shrink existing 
14dd0 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49  constructs..** I
14de0 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74  t merely prevent
14df0 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73  s new constructs
14e00 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65   that exceed the
14e10 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66   limit.** from f
14e20 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  orming..*/.int s
14e30 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c  qlite3_limit(sql
14e40 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69  ite3 *db, int li
14e50 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69  mitId, int newLi
14e60 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c  mit){.  int oldL
14e70 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  imit;..#ifdef SQ
14e80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
14e90 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
14ea0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
14eb0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
14ec0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
14ed0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
14ee0 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n -1;.  }.#endif
14ef0 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
14f00 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
14f10 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
14f20 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
14f30 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
14f40 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
14f50 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
14f60 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
14f70 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
14f80 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
14f90 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
14fa0 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
14fb0 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
14fc0 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
14fd0 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
14fe0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
14ff0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15000 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
15010 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
15020 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
15030 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15040 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
15050 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
15060 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
15070 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15080 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
15090 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
150a0 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
150b0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
150c0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
150d0 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
150e0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
150f0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
15100 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15110 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
15120 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
15130 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
15140 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
15150 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
15160 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
15170 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
15180 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
15190 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
151a0 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
151b0 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
151c0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
151d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
151e0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
151f0 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
15200 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
15210 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
15220 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15230 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
15240 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
15250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
15290 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
152a0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
152b0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
152c0 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
152d0 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
152e0 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
152f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15300 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15310 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
15320 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
15330 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
15340 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15350 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15360 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
15370 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57  S]==SQLITE_MAX_W
15380 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b  ORKER_THREADS );
15390 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
153a0 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
153b0 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f  HREADS==(SQLITE_
153c0 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
153d0 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
153e0 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
153f0 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
15400 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
15410 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
15420 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
15430 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
15440 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
15450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
15460 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
15470 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
15480 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
15490 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
154a0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
154b0 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
154c0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
154d0 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
154e0 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
154f0 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
15500 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
15510 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
15540 33 35 34 31 39 20 2a 2f 0a 7d 0a 23 69 66 20 64  35419 */.}.#if d
15550 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
15560 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c  ABLE_AUTO_PROFIL
15570 45 29 0a 2f 2a 20 73 74 64 65 72 72 20 6c 6f 67  E)./* stderr log
15580 67 69 6e 67 20 2a 2f 0a 76 6f 69 64 20 5f 73 71  ging */.void _sq
15590 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c  lite_auto_profil
155a0 65 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  e(void *aux, con
155b0 73 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36  st char *sql, u6
155c0 34 20 6e 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c  4 ns);.void _sql
155d0 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28 76  ite_auto_trace(v
155e0 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
155f0 63 68 61 72 20 2a 73 71 6c 29 3b 0a 76 6f 69 64  char *sql);.void
15600 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72   _sqlite_auto_pr
15610 6f 66 69 6c 65 28 76 6f 69 64 20 2a 61 75 78 2c  ofile(void *aux,
15620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
15630 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23 70 72 61  , u64 ns) {.#pra
15640 67 6d 61 20 75 6e 75 73 65 64 28 61 75 78 29 0a  gma unused(aux).
15650 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
15660 20 22 51 75 65 72 79 3a 20 25 73 5c 6e 20 45 78   "Query: %s\n Ex
15670 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25 6c  ecution Time: %l
15680 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e  lu ms\n", sql, n
15690 73 20 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d 0a  s / 1000000);.}.
156a0 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
156b0 6f 5f 74 72 61 63 65 28 76 6f 69 64 20 2a 61 75  o_trace(void *au
156c0 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  x, const char *s
156d0 71 6c 29 20 7b 0a 09 66 70 72 69 6e 74 66 28 73  ql) {..fprintf(s
156e0 74 64 65 72 72 2c 20 22 54 72 61 63 65 53 51 4c  tderr, "TraceSQL
156f0 28 25 70 29 3a 20 25 73 5c 6e 22 2c 20 61 75 78  (%p): %s\n", aux
15700 2c 20 73 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 73 79  , sql);.}../* sy
15710 73 6c 6f 67 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a  slog logging */.
15720 23 69 6e 63 6c 75 64 65 20 3c 61 73 6c 2e 68 3e  #include <asl.h>
15730 0a 73 74 61 74 69 63 20 61 73 6c 63 6c 69 65 6e  .static aslclien
15740 74 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74  t autolog_client
15750 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
15760 76 6f 69 64 20 5f 63 6c 6f 73 65 5f 61 73 6c 5f  void _close_asl_
15770 6c 6f 67 28 29 20 7b 0a 20 20 69 66 28 20 4e 55  log() {.  if( NU
15780 4c 4c 21 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  LL!=autolog_clie
15790 6e 74 20 29 7b 0a 20 20 20 20 61 73 6c 5f 63 6c  nt ){.    asl_cl
157a0 6f 73 65 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  ose(autolog_clie
157b0 6e 74 29 3b 0a 20 20 20 20 61 75 74 6f 6c 6f 67  nt);.    autolog
157c0 5f 63 6c 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a  _client = NULL;.
157d0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
157e0 64 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28  d _open_asl_log(
157f0 29 20 7b 0a 20 20 69 66 28 20 4e 55 4c 4c 3d 3d  ) {.  if( NULL==
15800 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 29  autolog_client )
15810 7b 0a 20 20 20 20 61 75 74 6f 6c 6f 67 5f 63 6c  {.    autolog_cl
15820 69 65 6e 74 20 3d 20 61 73 6c 5f 6f 70 65 6e 28  ient = asl_open(
15830 22 53 51 4c 69 74 65 22 2c 20 4e 55 4c 4c 2c 20  "SQLite", NULL, 
15840 30 29 3b 0a 20 20 20 20 61 74 65 78 69 74 28 5f  0);.    atexit(_
15850 63 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67 29 3b 0a  close_asl_log);.
15860 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 5f 73 71 6c    }.}..void _sql
15870 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65  ite_auto_profile
15880 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75  _syslog(void *au
15890 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  x, const char *s
158a0 71 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f 69  ql, u64 ns);.voi
158b0 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74  d _sqlite_auto_t
158c0 72 61 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64  race_syslog(void
158d0 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61   *aux, const cha
158e0 72 20 2a 73 71 6c 29 3b 0a 76 6f 69 64 20 5f 73  r *sql);.void _s
158f0 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69  qlite_auto_profi
15900 6c 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a  le_syslog(void *
15910 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  aux, const char 
15920 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a  *sql, u64 ns) {.
15930 23 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28 61  #pragma unused(a
15940 75 78 29 0a 09 61 73 6c 5f 6c 6f 67 28 61 75 74  ux)..asl_log(aut
15950 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c  olog_client, NUL
15960 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54  L, ASL_LEVEL_NOT
15970 49 43 45 2c 20 22 51 75 65 72 79 3a 20 25 73 5c  ICE, "Query: %s\
15980 6e 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d 65  n Execution Time
15990 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71  : %llu ms\n", sq
159a0 6c 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30 29  l, ns / 1000000)
159b0 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  ;.}.void _sqlite
159c0 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c  _auto_trace_sysl
159d0 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f  og(void *aux, co
159e0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29 20 7b  nst char *sql) {
159f0 0a 09 61 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f  ..asl_log(autolo
15a00 67 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20  g_client, NULL, 
15a10 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43 45  ASL_LEVEL_NOTICE
15a20 2c 20 22 54 72 61 63 65 53 51 4c 28 25 70 29 3a  , "TraceSQL(%p):
15a30 20 25 73 5c 6e 22 2c 20 61 75 78 2c 20 73 71 6c   %s\n", aux, sql
15a40 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
15a50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15a60 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73   is used to pars
15a70 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20  e both URIs and 
15a80 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
15a90 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a  s passed by the.
15aa0 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66  ** user to API f
15ab0 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33  unctions sqlite3
15ac0 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
15ad0 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e  e3_open_v2(), an
15ae0 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a  d for database.*
15af0 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64  * URIs specified
15b00 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41   as part of ATTA
15b10 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CH statements..*
15b20 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
15b30 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
15b40 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
15b50 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
15b60 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20  to use (or.** a 
15b70 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20  NULL to signify 
15b80 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29  the default VFS)
15b90 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73   if the URI does
15ba0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22   not contain a "
15bb0 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72  vfs=xxx".** quer
15bc0 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65  y parameter. The
15bd0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15be0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52   contains the UR
15bf0 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69  I (or non-URI fi
15c00 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c  lename).** itsel
15c10 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  f. When this fun
15c20 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15c30 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69  the *pFlags vari
15c40 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74  able should cont
15c50 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  ain.** the defau
15c60 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  lt flags to open
15c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
15c80 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76  ndle with. The v
15c90 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
15ca0 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65  * *pFlags may be
15cb0 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20   updated before 
15cc0 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65  returning if the
15cd0 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f   URI filename co
15ce0 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68  ntains .** "cach
15cf0 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d  e=xxx" or "mode=
15d00 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d  xxx" query param
15d10 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eters..**.** If 
15d20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
15d30 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
15d40 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
15d50 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f  *ppVfs is set to
15d60 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
15d70 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64   VFS that should
15d80 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e   be used to open
15d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15da0 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73  le. *pzFile is s
15db0 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  et to.** point t
15dc0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
15dd0 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  ining the name o
15de0 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70  f the file to op
15df0 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  en. It is the .*
15e00 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
15e10 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
15e20 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c  o eventually cal
15e30 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
15e40 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74   to release.** t
15e50 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  his buffer..**.*
15e60 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
15e70 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51  curs, then an SQ
15e80 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
15e90 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
15ea0 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79  *pzErrMsg.** may
15eb0 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
15ec0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
15ed0 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69  taining an Engli
15ee0 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
15ef0 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49  r .** message. I
15f00 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
15f10 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
15f20 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
15f30 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  lly release.** t
15f40 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61  his buffer by ca
15f50 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
15f60 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ee()..*/.int sql
15f70 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20  ite3ParseUri(.  
15f80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66  const char *zDef
15f90 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20  aultVfs,        
15fa0 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66  /* VFS to use if
15fb0 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75   no "vfs=xxx" qu
15fc0 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ery option */.  
15fd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
15fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15ff0 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
16000 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a  d URI to parse *
16010 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
16020 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20   *pFlags,       
16030 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
16040 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
16050 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
16060 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20  3_vfs **ppVfs,  
16070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16080 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20  : VFS to use */ 
16090 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65  .  char **pzFile
160a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
160b0 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e     /* OUT: Filen
160c0 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ame component of
160d0 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a   URI */.  char *
160e0 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20  *pzErrMsg       
160f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16100 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  : Error message 
16110 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (if rc!=SQLITE_O
16120 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  K) */.){.  int r
16130 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16140 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
16150 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20  ags = *pFlags;. 
16160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
16170 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b  s = zDefaultVfs;
16180 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
16190 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20    char c;.  int 
161a0 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nUri = sqlite3St
161b0 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20  rlen30(zUri);.. 
161c0 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d   assert( *pzErrM
161d0 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  sg==0 );..  if( 
161e0 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
161f0 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20  _OPEN_URI)      
16200 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
16210 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a  -48725-32206 */.
16220 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
16230 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16240 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20  ig.bOpenUri) /* 
16250 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35  IMP: R-51689-465
16260 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69  48 */.   && nUri
16270 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55  >=5 && memcmp(zU
16280 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d  ri, "file:", 5)=
16290 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38  =0 /* IMP: R-578
162a0 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b  84-37496 */.  ){
162b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b  .    char *zOpt;
162c0 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b  .    int eState;
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61     /* Parser sta
162f0 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  te when parsing 
16300 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  URI */.    int i
16310 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
16320 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
16330 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
16340 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  x */.    int iOu
16350 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
16360 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
16370 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
16380 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74   */.    u64 nByt
16390 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20  e = nUri+2;     
163a0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
163b0 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
163c0 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  ate */..    /* M
163d0 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c  ake sure the SQL
163e0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61  ITE_OPEN_URI fla
163f0 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69  g is set to indi
16400 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20  cate to the VFS 
16410 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65  xOpen .    ** me
16420 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20  thod that there 
16430 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72  may be extra par
16440 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e  ameters followin
16450 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e  g the file-name.
16460 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c    */.    flags |
16470 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  = SQLITE_OPEN_UR
16480 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d  I;..    for(iIn=
16490 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e  0; iIn<nUri; iIn
164a0 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55  ++) nByte += (zU
164b0 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20  ri[iIn]=='&');. 
164c0 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
164d0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
164e0 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  e);.    if( !zFi
164f0 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
16500 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a  TE_NOMEM_BKPT;..
16510 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66      iIn = 5;.#if
16520 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57  def SQLITE_ALLOW
16530 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20  _URI_AUTHORITY. 
16540 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
16550 55 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29  Uri+5, "///", 3)
16560 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  ==0 ){.      iIn
16570 20 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54   = 7;.      /* T
16580 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
16590 64 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52  dition causes UR
165a0 49 73 20 77 69 74 68 20 66 69 76 65 20 6c 65 61  Is with five lea
165b0 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72  ding / character
165c0 73 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20  s.      ** like 
165d0 66 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70  file://///host/p
165e0 61 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72  ath to be conver
165f0 74 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69  ted into UNCs li
16600 6b 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a  ke //host/path..
16610 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72        ** The cor
16620 72 65 63 74 20 55 52 49 20 66 6f 72 20 74 68 61  rect URI for tha
16630 74 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74  t UNC has only t
16640 77 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69  wo or four leadi
16650 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a  ng / characters.
16660 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f        ** file://
16670 68 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c  host/path or fil
16680 65 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e  e:////host/path.
16690 20 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20    But 5 leading 
166a0 73 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20 20  slashes is a .  
166b0 20 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72      ** common er
166c0 72 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64  ror, we are told
166d0 2c 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69  , so we handle i
166e0 74 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  t as a special c
166f0 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ase. */.      if
16700 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37  ( strncmp(zUri+7
16710 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29  , "///", 3)==0 )
16720 7b 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d  { iIn++; }.    }
16730 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
16740 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61  (zUri+5, "//loca
16750 6c 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20  lhost/", 12)==0 
16760 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31  ){.      iIn = 1
16770 36 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  6;.    }.#else. 
16780 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
16790 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74  e scheme and aut
167a0 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20  hority segments 
167b0 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20  of the URI. */. 
167c0 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d     if( zUri[5]==
167d0 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d  '/' && zUri[6]==
167e0 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '/' ){.      iIn
167f0 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 7;.      whil
16800 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20  e( zUri[iIn] && 
16810 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29  zUri[iIn]!='/' )
16820 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
16830 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e  ( iIn!=7 && (iIn
16840 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22  !=16 || memcmp("
16850 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72  localhost", &zUr
16860 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20  i[7], 9)) ){.   
16870 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
16880 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16890 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75  ("invalid uri au
168a0 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20  thority: %.*s", 
168b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
168c0 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20  -7, &zUri[7]);. 
168d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
168e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
168f0 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
16900 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
16910 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
16920 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65  /* Copy the file
16930 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65  name and any que
16940 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e  ry parameters in
16950 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66  to the zFile buf
16960 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63  fer. .    ** Dec
16970 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63  ode %HH escape c
16980 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77  odes along the w
16990 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ay. .    **.    
169a0 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c  ** Within this l
169b0 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53  oop, variable eS
169c0 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20  tate may be set 
169d0 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65  to 0, 1 or 2, de
169e0 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  pending.    ** o
169f0 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f  n the parsing co
16a00 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77  ntext. As follow
16a10 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
16a20 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69     0: Parsing fi
16a30 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20  le-name..    ** 
16a40 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d    1: Parsing nam
16a50 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
16a60 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
16a70 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
16a80 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76  *   2: Parsing v
16a90 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  alue section of 
16aa0 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65  a name=value que
16ab0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20  ry parameter..  
16ac0 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20    */.    eState 
16ad0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
16ae0 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
16af0 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a  =0 && c!='#' ){.
16b00 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
16b10 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20     if( c=='%' . 
16b20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
16b30 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
16b40 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73  n]) .       && s
16b50 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
16b60 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20  Uri[iIn+1]) .   
16b70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
16b80 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74  t octet = (sqlit
16b90 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
16ba0 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20  iIn++]) << 4);. 
16bb0 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20         octet += 
16bc0 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
16bd0 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20  zUri[iIn++]);.. 
16be0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
16bf0 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74  ctet>=0 && octet
16c00 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20  <256 );.        
16c10 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a  if( octet==0 ){.
16c20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
16c30 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52  NABLE_URI_00_ERR
16c40 4f 52 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OR.          /* 
16c50 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
16c60 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20  aken when "%00" 
16c70 61 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74  appears within t
16c80 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a  he URI. In this.
16c90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
16ca0 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20  e we ignore all 
16cb0 74 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61  text in the rema
16cc0 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74  inder of the pat
16cd0 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20  h, name or.     
16ce0 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75       ** value cu
16cf0 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61  rrently being pa
16d00 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20  rsed. So ignore 
16d10 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72  the current char
16d20 61 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20  acter.          
16d30 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74  ** and skip to t
16d40 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22  he next "?", "="
16d50 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72   or "&", as appr
16d60 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20  opriate. */.    
16d70 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20        while( (c 
16d80 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
16d90 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20  && c!='#' .     
16da0 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
16db0 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27  ate!=0 || c!='?'
16dc0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
16dd0 26 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c  && (eState!=1 ||
16de0 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27   (c!='=' && c!='
16df0 26 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  &')).           
16e00 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32     && (eState!=2
16e10 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20   || c!='&').    
16e20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16e30 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
16e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16e50 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73    continue;.#els
16e60 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  e.          /* I
16e70 66 20 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f  f ENABLE_URI_00_
16e80 45 52 52 4f 52 20 69 73 20 64 65 66 69 6e 65 64  ERROR is defined
16e90 2c 20 22 25 30 30 22 20 69 6e 20 61 20 55 52 49  , "%00" in a URI
16ea0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f   is an error. */
16eb0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72  .          *pzEr
16ec0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
16ed0 70 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63 74  printf("unexpect
16ee0 65 64 20 25 25 30 30 20 69 6e 20 75 72 69 22 29  ed %%00 in uri")
16ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
16f00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16f10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
16f20 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e  rse_uri_out;.#en
16f30 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
16f40 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b        c = octet;
16f50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
16f60 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63   eState==1 && (c
16f70 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29  =='&' || c=='=')
16f80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
16f90 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30  zFile[iOut-1]==0
16fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
16fb0 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e   An empty option
16fc0 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68   name. Ignore th
16fd0 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65  is option altoge
16fe0 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ther. */.       
16ff0 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
17000 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
17010 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49  !='#' && zUri[iI
17020 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b  n-1]!='&' ) iIn+
17030 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
17040 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
17050 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
17060 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '&' ){.         
17070 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
17080 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\0';.        }
17090 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
170a0 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
170b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
170c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
170d0 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20   if( (eState==0 
170e0 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65  && c=='?') || (e
170f0 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27  State==2 && c=='
17100 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  &') ){.        c
17110 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53   = 0;.        eS
17120 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
17130 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f  }.      zFile[iO
17140 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d  ut++] = c;.    }
17150 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d  .    if( eState=
17160 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  =1 ) zFile[iOut+
17170 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
17180 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
17190 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
171a0 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a  Out++] = '\0';..
171b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
171c0 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f  there were any o
171d0 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64  ptions specified
171e0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
171f0 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20  interpreted .   
17200 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e   ** here. Option
17210 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72  s that are inter
17220 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c  preted here incl
17230 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68  ude "vfs" and th
17240 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ose that.    ** 
17250 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c  correspond to fl
17260 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ags that may be 
17270 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71  passed to the sq
17280 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a  lite3_open_v2().
17290 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a      ** method. *
172a0 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46  /.    zOpt = &zF
172b0 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ile[sqlite3Strle
172c0 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20  n30(zFile)+1];. 
172d0 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30     while( zOpt[0
172e0 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ] ){.      int n
172f0 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Opt = sqlite3Str
17300 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20  len30(zOpt);.   
17310 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20     char *zVal = 
17320 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20  &zOpt[nOpt+1];. 
17330 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20       int nVal = 
17340 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17350 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66  zVal);..      if
17360 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d  ( nOpt==3 && mem
17370 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c  cmp("vfs", zOpt,
17380 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
17390 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20    zVfs = zVal;. 
173a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
173b0 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d      struct OpenM
173c0 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ode {.          
173d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
173e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
173f0 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d  e;.        } *aM
17400 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
17410 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65   char *zModeType
17420 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
17430 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  t mask = 0;.    
17440 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
17450 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  0;..        if( 
17460 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d  nOpt==5 && memcm
17470 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c  p("cache", zOpt,
17480 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   5)==0 ){.      
17490 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
174a0 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68  t OpenMode aCach
174b0 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eMode[] = {.    
174c0 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65          { "share
174d0 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  d",  SQLITE_OPEN
174e0 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a  _SHAREDCACHE },.
174f0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70              { "p
17500 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  rivate", SQLITE_
17510 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
17520 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
17530 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
17540 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
17550 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
17560 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
17570 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  |SQLITE_OPEN_PRI
17580 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20  VATECACHE;.     
17590 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61       aMode = aCa
175a0 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  cheMode;.       
175b0 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b     limit = mask;
175c0 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
175d0 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a  Type = "cache";.
175e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
175f0 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26    if( nOpt==4 &&
17600 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20   memcmp("mode", 
17610 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  zOpt, 4)==0 ){. 
17620 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
17630 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
17640 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  aOpenMode[] = {.
17650 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
17660 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  o",  SQLITE_OPEN
17670 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20  _READONLY },.   
17680 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c           { "rw",
17690 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
176a0 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20  ADWRITE }, .    
176b0 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c          { "rwc",
176c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
176d0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
176e0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
176f0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65             { "me
17700 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50  mory", SQLITE_OP
17710 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20  EN_MEMORY },.   
17720 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
17730 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
17740 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
17750 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17760 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f  DONLY | SQLITE_O
17770 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17790 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
177a0 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
177b0 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20  PEN_MEMORY;.    
177c0 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f        aMode = aO
177d0 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  penMode;.       
177e0 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20     limit = mask 
177f0 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  & flags;.       
17800 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
17810 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20  access";.       
17820 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
17830 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  aMode ){.       
17840 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
17850 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30      int mode = 0
17860 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
17870 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  i=0; aMode[i].z;
17880 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
17890 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
178a0 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20   = aMode[i].z;. 
178b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
178c0 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  Val==sqlite3Strl
178d0 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65  en30(z) && 0==me
178e0 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56  mcmp(zVal, z, nV
178f0 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
17900 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64       mode = aMod
17910 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20  e[i].mode;.     
17920 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17930 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17950 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20      if( mode==0 
17960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
17970 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
17980 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
17990 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22  uch %s mode: %s"
179a0 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61  , zModeType, zVa
179b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
179c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
179d0 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  R;.            g
179e0 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
179f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
17a00 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f           if( (mo
17a10 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  de & ~SQLITE_OPE
17a20 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20  N_MEMORY)>limit 
17a30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
17a40 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
17a50 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d  e3_mprintf("%s m
17a60 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a  ode not allowed:
17a70 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d                zM
17aa0 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
17ac0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
17ad0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
17ae0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
17af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17b00 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61      flags = (fla
17b10 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f  gs & ~mask) | mo
17b20 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  de;.        }.  
17b30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70      }..      zOp
17b40 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31  t = &zVal[nVal+1
17b50 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  ];.    }..  }els
17b60 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73  e{.    zFile = s
17b70 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
17b80 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28  nUri+2);.    if(
17b90 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
17ba0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
17bb0 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69  PT;.    if( nUri
17bc0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
17bd0 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55  (zFile, zUri, nU
17be0 72 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ri);.    }.    z
17bf0 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30  File[nUri] = '\0
17c00 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  ';.    zFile[nUr
17c10 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  i+1] = '\0';.   
17c20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
17c30 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a  E_OPEN_URI;.  }.
17c40 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69  .  *ppVfs = sqli
17c50 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66  te3_vfs_find(zVf
17c60 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73  s);.  if( *ppVfs
17c70 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  ==0 ){.    *pzEr
17c80 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
17c90 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
17ca0 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b  vfs: %s", zVfs);
17cb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17cc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72  _ERROR;.  }. par
17cd0 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66  se_uri_out:.  if
17ce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17cf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
17d00 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ree(zFile);.    
17d10 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zFile = 0;.  }. 
17d20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73   *pFlags = flags
17d30 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46  ;.  *pzFile = zF
17d40 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ile;.  return rc
17d50 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
17d60 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
17d70 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 23 64 65  UTO_PROFILE).#de
17d80 66 69 6e 65 20 53 51 4c 49 54 45 5f 41 55 54 4f  fine SQLITE_AUTO
17d90 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 31  LOGGING_STDERR 1
17da0 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
17db0 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c  AUTOLOGGING_SYSL
17dc0 4f 47 20 32 0a 73 74 61 74 69 63 20 76 6f 69 64  OG 2.static void
17dd0 20 65 6e 61 62 6c 65 41 75 74 6f 4c 6f 67 67 69   enableAutoLoggi
17de0 6e 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ng(.  sqlite3 *d
17df0 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a 65 6e 76  b.){.  char *env
17e00 70 72 6f 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  profile = getenv
17e10 28 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 50 52  ("SQLITE_AUTO_PR
17e20 4f 46 49 4c 45 22 29 3b 0a 20 20 0a 20 20 69 66  OFILE");.  .  if
17e30 28 20 65 6e 76 70 72 6f 66 69 6c 65 21 3d 4e 55  ( envprofile!=NU
17e40 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 68  LL ){.    int wh
17e50 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ere = 0;.    if(
17e60 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22 31   !strncasecmp("1
17e70 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20 31  ", envprofile, 1
17e80 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
17e90 73 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20  satty(2) ){.    
17ea0 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49      where = SQLI
17eb0 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
17ec0 54 44 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c  TDERR;.      }el
17ed0 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72  se{.        wher
17ee0 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  e = SQLITE_AUTOL
17ef0 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20  OGGING_SYSLOG;. 
17f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
17f10 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63  e if( !strncasec
17f20 6d 70 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76  mp("stderr", env
17f30 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b 0a 20  profile, 6) ){. 
17f40 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c       where = SQL
17f50 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
17f60 53 54 44 45 52 52 3b 0a 20 20 20 20 7d 20 65 6c  STDERR;.    } el
17f70 73 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65  se if( !strncase
17f80 63 6d 70 28 22 73 79 73 6c 6f 67 22 2c 20 65 6e  cmp("syslog", en
17f90 76 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b 0a  vprofile, 6) ){.
17fa0 20 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51        where = SQ
17fb0 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
17fc0 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d 0a 20  _SYSLOG;.    }. 
17fd0 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51     if( where==SQ
17fe0 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47  LITE_AUTOLOGGING
17ff0 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20 20 20  _STDERR ){.     
18000 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
18010 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74  (db, _sqlite_aut
18020 6f 5f 70 72 6f 66 69 6c 65 2c 20 64 62 29 3b 0a  o_profile, db);.
18030 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68      }else if( wh
18040 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f  ere==SQLITE_AUTO
18050 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20 29  LOGGING_SYSLOG )
18060 7b 0a 20 20 20 20 20 20 5f 6f 70 65 6e 5f 61 73  {.      _open_as
18070 6c 5f 6c 6f 67 28 29 3b 0a 20 20 20 20 20 20 73  l_log();.      s
18080 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 64  qlite3_profile(d
18090 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  b, _sqlite_auto_
180a0 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 2c 20  profile_syslog, 
180b0 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  db);.    }.  }. 
180c0 20 63 68 61 72 20 2a 65 6e 76 74 72 61 63 65 20   char *envtrace 
180d0 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
180e0 5f 41 55 54 4f 5f 54 52 41 43 45 22 29 3b 0a 20  _AUTO_TRACE");. 
180f0 20 69 66 28 20 65 6e 76 74 72 61 63 65 21 3d 4e   if( envtrace!=N
18100 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 77  ULL ){.    int w
18110 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  here = 0;.    if
18120 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22  ( !strncasecmp("
18130 31 22 2c 20 65 6e 76 74 72 61 63 65 2c 20 31 29  1", envtrace, 1)
18140 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
18150 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20 20  atty(2) ){.     
18160 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
18170 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54  E_AUTOLOGGING_ST
18180 44 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DERR;.      }els
18190 65 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  e{.        where
181a0 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f   = SQLITE_AUTOLO
181b0 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20  GGING_SYSLOG;.  
181c0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
181d0 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d   if( !strncasecm
181e0 70 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76 74  p("stderr", envt
181f0 72 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20  race, 6) ){.    
18200 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
18210 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44  _AUTOLOGGING_STD
18220 45 52 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ERR;.    } else 
18230 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70  if( !strncasecmp
18240 28 22 73 79 73 6c 6f 67 22 2c 20 65 6e 76 74 72  ("syslog", envtr
18250 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20  ace, 6) ){.     
18260 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f   where = SQLITE_
18270 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c  AUTOLOGGING_SYSL
18280 4f 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OG;.    }.    if
18290 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f  ( where==SQLITE_
182a0 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45  AUTOLOGGING_STDE
182b0 52 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  RR ){.      sqli
182c0 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f 73  te3_trace(db, _s
182d0 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65  qlite_auto_trace
182e0 2c 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , db);.    }else
182f0 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49   if( where==SQLI
18300 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
18310 59 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f  YSLOG ){.      _
18320 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a  open_asl_log();.
18330 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
18340 61 63 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f  ace(db, _sqlite_
18350 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f  auto_trace_syslo
18360 67 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  g, db);.    }.  
18370 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
18380 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
18390 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
183a0 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61  opening a databa
183b0 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a  se on behalf of.
183c0 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
183d0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70  ) and sqlite3_op
183e0 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61  en16(). The data
183f0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a  base filename "z
18400 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69  Filename"  .** i
18410 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e  s UTF-8 encoded.
18420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
18430 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63  penDatabase(.  c
18440 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
18450 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73  name, /* Databas
18460 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38  e filename UTF-8
18470 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71   encoded */.  sq
18480 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
18490 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
184a0 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68  urned database h
184b0 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67  andle */.  unsig
184c0 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  ned int flags,  
184d0 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c    /* Operational
184e0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
184f0 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
18500 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18510 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  e VFS to use */.
18520 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
18530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18540 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c       /* Store al
18550 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68  located handle h
18560 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ere */.  int rc;
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18580 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
18590 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
185a0 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20   isThreadsafe;  
185b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
185c0 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73  True for threads
185d0 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  afe connections 
185e0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e  */.  char *zOpen
185f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
18600 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
18610 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   argument to pas
18620 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29  s to BtreeOpen()
18630 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   */.  char *zErr
18640 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Msg = 0;        
18650 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
18660 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69  essage from sqli
18670 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f  te3ParseUri() */
18680 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18690 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
186a0 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29  .  if( ppDb==0 )
186b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
186c0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
186d0 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  if.  *ppDb = 0;.
186e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
186f0 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
18700 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
18710 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
18720 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
18730 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
18740 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18750 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20  g.bCoreMutex==0 
18760 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
18770 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
18780 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
18790 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
187a0 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
187b0 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
187c0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
187d0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
187e0 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72  TEX ){.    isThr
187f0 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d  eadsafe = 1;.  }
18800 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65  else{.    isThre
18810 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33  adsafe = sqlite3
18820 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
18830 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 0a 20 20  llMutex;.  }..  
18840 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
18850 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
18860 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67  ACHE ){.    flag
18870 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
18880 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
18890 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
188a0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
188b0 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
188c0 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  d ){.    flags |
188d0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  = SQLITE_OPEN_SH
188e0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
188f0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d    /* Remove harm
18900 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68  ful bits from th
18910 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
18920 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  r.  **.  ** The 
18930 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
18940 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  TEX and SQLITE_O
18950 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c  PEN_FULLMUTEX fl
18960 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65  ags were.  ** de
18970 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65 20  alt with in the 
18980 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c  previous code bl
18990 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68  ock.  Besides th
189a0 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20  ese, the only.  
189b0 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66  ** valid input f
189c0 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
189d0 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53  _open_v2() are S
189e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
189f0 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  NLY,.  ** SQLITE
18a00 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c  _OPEN_READWRITE,
18a10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
18a20 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ATE, SQLITE_OPEN
18a30 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20  _SHAREDCACHE,.  
18a40 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ** SQLITE_OPEN_P
18a50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64  RIVATECACHE, and
18a60 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62   some reserved b
18a70 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d  its.  Silently m
18a80 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c  ask.  ** off all
18a90 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20   other flags..  
18aa0 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e  */.  flags &=  ~
18ab0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  ( SQLITE_OPEN_DE
18ac0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18ae0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
18af0 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  VE |.           
18b00 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
18b10 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20  MAIN_DB |.      
18b20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18b30 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a  OPEN_TEMP_DB | .
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18b50 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
18b60 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20  IENT_DB | .     
18b70 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18b80 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
18b90 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
18ba0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18bb0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _TEMP_JOURNAL | 
18bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18bd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
18be0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
18bf0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18c00 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
18c10 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NAL |.          
18c20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18c30 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  _NOMUTEX |.     
18c40 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18c50 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
18c60 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
18c70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
18c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  .             );
18c90 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
18ca0 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 20  the sqlite data 
18cb0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64  structure */.  d
18cc0 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  b = sqlite3Mallo
18cd0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71  cZero( sizeof(sq
18ce0 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20  lite3) );.  if( 
18cf0 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65  db==0 ) goto ope
18d00 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69  ndb_out;.  if( i
18d10 73 54 68 72 65 61 64 73 61 66 65 20 0a 23 69 66  sThreadsafe .#if
18d20 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18d30 45 5f 4d 55 4c 54 49 54 48 52 45 41 44 45 44 5f  E_MULTITHREADED_
18d40 43 48 45 43 4b 53 0a 20 20 20 7c 7c 20 73 71 6c  CHECKS.   || sql
18d50 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18d60 2e 62 43 6f 72 65 4d 75 74 65 78 0a 23 65 6e 64  .bCoreMutex.#end
18d70 69 66 0a 20 20 29 7b 0a 20 20 20 20 64 62 2d 3e  if.  ){.    db->
18d80 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
18d90 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
18da0 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
18db0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
18dc0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
18dd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
18de0 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
18df0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
18e00 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
18e10 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
18e20 66 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  fe==0 ){.      s
18e30 71 6c 69 74 65 33 4d 75 74 65 78 57 61 72 6e 4f  qlite3MutexWarnO
18e40 6e 43 6f 6e 74 65 6e 74 69 6f 6e 28 64 62 2d 3e  nContention(db->
18e50 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
18e60 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
18e70 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
18e80 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
18e90 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
18ea0 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d  nDb = 2;.  db->m
18eb0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
18ec0 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e  GIC_BUSY;.  db->
18ed0 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
18ee0 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tic;..  assert( 
18ef0 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
18f00 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
18f10 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
18f20 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
18f30 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
18f40 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
18f50 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
18f60 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
18f70 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49  _THREADS] = SQLI
18f80 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45  TE_DEFAULT_WORKE
18f90 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d  R_THREADS;.  db-
18fa0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
18fb0 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76  .  db->nextAutov
18fc0 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73  ac = -1;.  db->s
18fd0 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47  zMmap = sqlite3G
18fe0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
18ff0 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61  ap;.  db->nextPa
19000 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62  gesize = 0;.  db
19010 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
19020 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20   = 0x7FFFFFFF;. 
19030 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
19040 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
19050 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62  es | SQLITE_Enab
19060 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49  leTrigger | SQLI
19070 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69  TE_CacheSpill.#i
19080 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
19090 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
190a0 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51  TIC_INDEX) || SQ
190b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
190c0 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20  OMATIC_INDEX.   
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
190e0 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
190f0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
19100 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46  TE_DEFAULT_CKPTF
19110 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20  ULLFSYNC.       
19120 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
19130 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63  TE_CkptFullFSync
19140 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
19150 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
19160 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20  FORMAT<4.       
19170 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
19180 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
19190 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
191a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41  QLITE_ENABLE_LOA
191b0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
191d0 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73  QLITE_LoadExtens
191e0 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ion.#endif.#if S
191f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45  QLITE_DEFAULT_RE
19200 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53  CURSIVE_TRIGGERS
19210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19220 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72    | SQLITE_RecTr
19230 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69  iggers.#endif.#i
19240 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19250 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
19260 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45  _KEYS) && SQLITE
19270 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
19280 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20  _KEYS.          
19290 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
192a0 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64  ForeignKeys.#end
192b0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
192c0 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e  QLITE_REVERSE_UN
192d0 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29  ORDERED_SELECTS)
192e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
192f0 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72    | SQLITE_Rever
19300 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 23  seOrder.#endif.#
19310 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19320 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
19330 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
19350 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
19360 43 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  Ck.#endif.#if de
19370 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
19380 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a  BLE_FTS3_TOKENIZ
19390 45 52 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER).            
193a0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 74       | SQLITE_Ft
193b0 73 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64  s3Tokenizer.#end
193c0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
193d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 51 50 53  QLITE_ENABLE_QPS
193e0 47 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  G).             
193f0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61      | SQLITE_Ena
19400 62 6c 65 51 50 53 47 0a 23 65 6e 64 69 66 0a 20  bleQPSG.#endif. 
19410 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33       ;.  sqlite3
19420 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43  HashInit(&db->aC
19430 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
19440 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
19450 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
19460 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
19470 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
19480 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
19490 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
194a0 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
194b0 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20  Y. BINARY works 
194c0 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20  for both UTF-8. 
194d0 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20   ** and UTF-16, 
194e0 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e  so add a version
194f0 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f   for each to avo
19500 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61  id any unnecessa
19510 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69  ry.  ** conversi
19520 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72  ons. The only er
19530 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63  ror that can occ
19540 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c  ur here is a mal
19550 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20  loc() failure.. 
19560 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43   **.  ** EVIDENC
19570 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34  E-OF: R-52786-44
19580 38 37 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e  878 SQLite defin
19590 65 73 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69  es three built-i
195a0 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a  n collating.  **
195b0 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f   functions:.  */
195c0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
195d0 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
195e0 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
195f0 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  UTF8, 0, binColl
19600 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
19610 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
19620 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
19630 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
19640 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
19650 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
19660 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
19670 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
19680 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c  LITE_UTF16LE, 0,
19690 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
196a0 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
196b0 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22  ion(db, "NOCASE"
196c0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
196d0 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  , nocaseCollatin
196e0 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  gFunc, 0);.  cre
196f0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
19700 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45   "RTRIM", SQLITE
19710 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c  _UTF8, (void*)1,
19720 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
19730 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
19740 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19750 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
19760 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e  .  }.  /* EVIDEN
19770 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31  CE-OF: R-08308-1
19780 37 32 32 34 20 54 68 65 20 64 65 66 61 75 6c 74  7224 The default
19790 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
197a0 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a  ion for all.  **
197b0 20 73 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41   strings is BINA
197c0 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  RY. .  */.  db->
197d0 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
197e0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
197f0 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
19800 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
19810 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
19820 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30  db->pDfltColl!=0
19830 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20   );..  /* Parse 
19840 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49  the filename/URI
19850 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 0a 20   argument.  **. 
19860 20 2a 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   ** Only allow s
19870 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
19880 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
19890 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
198a0 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
198b0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
198c0 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
198d0 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
198e0 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
198f0 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
19900 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
19910 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
19920 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
19930 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
19940 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
19950 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
19960 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
19970 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
19980 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19990 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
199a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
199b0 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
199c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
199d0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
199e0 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
199f0 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d   db->openFlags =
19a00 20 66 6c 61 67 73 3b 0a 20 20 61 73 73 65 72 74   flags;.  assert
19a10 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
19a20 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20  ADONLY  == 0x01 
19a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
19a40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
19a50 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20  TE == 0x02 );.  
19a60 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
19a70 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d  PEN_CREATE    ==
19a80 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63   0x04 );.  testc
19a90 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
19aa0 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20  7))==0x02 ); /* 
19ab0 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65  READONLY */.  te
19ac0 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
19ad0 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20  gs&7))==0x04 ); 
19ae0 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a  /* READWRITE */.
19af0 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
19b00 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30  (flags&7))==0x40
19b10 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
19b20 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69   | CREATE */.  i
19b30 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37  f( ((1<<(flags&7
19b40 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b  )) & 0x46)==0 ){
19b50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19b60 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f  _MISUSE_BKPT;  /
19b70 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34  * IMP: R-65497-4
19b80 34 35 39 34 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  4594 */.  }else{
19b90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19ba0 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20  3ParseUri(zVfs, 
19bb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67  zFilename, &flag
19bc0 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a  s, &db->pVfs, &z
19bd0 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b  Open, &zErrMsg);
19be0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
19bf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
19c10 4f 4d 45 4d 20 29 20 73 71 6c 69 74 65 33 4f 6f  OMEM ) sqlite3Oo
19c20 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
19c30 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
19c40 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72  Msg(db, rc, zErr
19c50 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
19c60 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
19c70 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
19c80 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  sg);.    goto op
19c90 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
19ca0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63   /* Open the bac
19cb0 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72  kend database dr
19cc0 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73  iver */.  rc = s
19cd0 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
19ce0 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c  db->pVfs, zOpen,
19cf0 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d   db, &db->aDb[0]
19d00 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  .pBt, 0,.       
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
19d30 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20  OPEN_MAIN_DB);. 
19d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19d50 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
19d60 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
19d70 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
19d80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
19d90 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
19da0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
19db0 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f   rc);.    goto o
19dc0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
19dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19de0 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
19df0 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  t);.  db->aDb[0]
19e00 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
19e10 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
19e20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
19e30 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
19e40 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64  ocFailed ) ENC(d
19e50 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28  b) = SCHEMA_ENC(
19e60 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
19e70 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62  reeLeave(db->aDb
19e80 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
19e90 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
19ea0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
19eb0 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  t(db, 0);..  /* 
19ec0 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
19ed0 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
19ee0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
19ef0 73 20 46 55 4c 4c 3b 20 66 6f 72 20 74 68 65 20  s FULL; for the 
19f00 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
19f10 73 65 20 69 74 20 69 73 20 4f 46 46 2e 20 54 68  se it is OFF. Th
19f20 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  is matches the p
19f30 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75  ager layer defau
19f40 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62  lts.  .  */.  db
19f50 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[0].zDbSNam
19f60 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
19f70 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
19f80 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44  level = SQLITE_D
19f90 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
19fa0 55 53 2b 31 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  US+1;.  db->aDb[
19fb0 31 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 74  1].zDbSName = "t
19fc0 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  emp";.  db->aDb[
19fd0 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  1].safety_level 
19fe0 3d 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  = PAGER_SYNCHRON
19ff0 4f 55 53 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e  OUS_OFF;..  db->
1a000 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1a010 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
1a020 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a030 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
1a040 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
1a050 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
1a060 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
1a070 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
1a080 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
1a090 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
1a0a0 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
1a0b0 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
1a0c0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
1a0d0 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
1a0e0 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
1a0f0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1a100 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
1a110 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  _OK);.  sqlite3R
1a120 65 67 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63  egisterPerConnec
1a130 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74  tionBuiltinFunct
1a140 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20 3d  ions(db);.  rc =
1a150 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1a160 28 64 62 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  (db);..#ifdef SQ
1a170 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35  LITE_ENABLE_FTS5
1a180 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
1a190 6e 79 20 62 75 69 6c 74 2d 69 6e 20 46 54 53 35  ny built-in FTS5
1a1a0 20 6d 6f 64 75 6c 65 20 62 65 66 6f 72 65 20 6c   module before l
1a1b0 6f 61 64 69 6e 67 20 74 68 65 20 61 75 74 6f 6d  oading the autom
1a1c0 61 74 69 63 0a 20 20 2a 2a 20 65 78 74 65 6e 73  atic.  ** extens
1a1d0 69 6f 6e 73 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ions. This allow
1a1e0 73 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65  s automatic exte
1a1f0 6e 73 69 6f 6e 73 20 74 6f 20 72 65 67 69 73 74  nsions to regist
1a200 65 72 20 46 54 53 35 20 0a 20 20 2a 2a 20 74 6f  er FTS5 .  ** to
1a210 6b 65 6e 69 7a 65 72 73 20 61 6e 64 20 61 75 78  kenizers and aux
1a220 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73  iliary functions
1a230 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
1a240 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1a250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a260 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1a270 65 33 46 74 73 35 49 6e 69 74 28 64 62 29 3b 0a  e3Fts5Init(db);.
1a280 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a290 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20   Load automatic 
1a2a0 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74  extensions - ext
1a2b0 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76  ensions that hav
1a2c0 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65  e been registere
1a2d0 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  d.  ** using the
1a2e0 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74   sqlite3_automat
1a2f0 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41  ic_extension() A
1a300 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  PI..  */.  if( r
1a310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a320 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c      sqlite3AutoL
1a330 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
1a340 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1a350 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
1a360 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a380 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
1a390 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1a3a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a3b0 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d  _FTS1.  if( !db-
1a3c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1a3d0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1a3e0 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
1a3f0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
1a400 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49  c = sqlite3Fts1I
1a410 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1a420 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1a430 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20  TE_ENABLE_FTS2. 
1a440 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1a450 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1a460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65  LITE_OK ){.    e
1a470 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1a480 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65  3Fts2Init(sqlite
1a490 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
1a4a0 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62  lite3Fts2Init(db
1a4b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a4c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a4d0 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f  BLE_FTS3 /* auto
1a4e0 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e 65  matically define
1a4f0 64 20 62 79 20 53 51 4c 49 54 45 5f 45 4e 41 42  d by SQLITE_ENAB
1a500 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66 28  LE_FTS4 */.  if(
1a510 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1a520 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
1a530 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1a540 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
1a550 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1a560 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1a570 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 29 20  ITE_ENABLE_ICU) 
1a580 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1a590 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f 43 4f 4c  E_ENABLE_ICU_COL
1a5a0 4c 41 54 49 4f 4e 53 29 0a 20 20 69 66 28 20 21  LATIONS).  if( !
1a5b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a5c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a5d0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1a5e0 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
1a5f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1a600 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a610 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
1a620 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a630 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a640 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
1a650 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
1a660 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a670 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a680 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 0a  BLE_DBPAGE_VTAB.
1a690 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a6a0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a6b0 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
1a6c0 63 20 3d 20 73 71 6c 69 74 65 33 44 62 70 61 67  c = sqlite3Dbpag
1a6d0 65 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20  eRegister(db);. 
1a6e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
1a6f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a700 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20 69 66  DBSTAT_VTAB.  if
1a710 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a720 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1a730 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
1a740 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65 67  sqlite3DbstatReg
1a750 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23  ister(db);.  }.#
1a760 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1a770 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  LITE_ENABLE_JSON
1a780 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  1.  if( !db->mal
1a790 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1a7a0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
1a7b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f   rc = sqlite3Jso
1a7c0 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  n1Init(db);.  }.
1a7d0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1a7e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
1a7f0 54 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d  TVTAB.  if( !db-
1a800 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1a810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
1a820 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a830 33 53 74 6d 74 56 74 61 62 49 6e 69 74 28 64 62  3StmtVtabInit(db
1a840 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1a850 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46   /* -DSQLITE_DEF
1a860 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
1a870 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53  E=1 makes EXCLUS
1a880 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20  IVE the default 
1a890 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
1a8a0 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46  e.  -DSQLITE_DEF
1a8b0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
1a8c0 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20  E=0 make NORMAL 
1a8d0 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
1a8e0 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
1a8f0 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74  Doing nothing at
1a900 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20   all also makes 
1a910 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
1a920 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  lt..  */.#ifdef 
1a930 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
1a940 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62  OCKING_MODE.  db
1a950 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d  ->dfltLockMode =
1a960 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1a970 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20  LOCKING_MODE;.  
1a980 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
1a990 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42  ingMode(sqlite3B
1a9a0 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
1a9b0 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20  b[0].pBt),.     
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9d0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
1a9e0 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
1a9f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
1aa00 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72 72   rc ) sqlite3Err
1aa10 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f  or(db, rc);..  /
1aa20 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f  * Enable the loo
1aa30 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75  kaside-malloc su
1aa40 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74  bsystem */.  set
1aa50 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
1aa60 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  0, sqlite3Global
1aa70 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
1aa80 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1aaa0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1aab0 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20  nLookaside);..  
1aac0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
1aad0 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53  checkpoint(db, S
1aae0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
1aaf0 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54  L_AUTOCHECKPOINT
1ab00 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a  );..opendb_out:.
1ab10 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
1ab20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65  assert( db->mute
1ab30 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64  x!=0 || isThread
1ab40 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  safe==0.        
1ab50 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f     || sqlite3Glo
1ab60 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
1ab70 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
1ab80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1ab90 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1aba0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1abb0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
1abc0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c   assert( db!=0 |
1abd0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
1abe0 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  EM );.  if( rc==
1abf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
1ac00 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
1ac10 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
1ac20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
1ac30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ac40 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1ac50 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
1ac60 4b 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  K;.  }.#if defin
1ac70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1ac80 20 45 4e 41 42 4c 45 5f 46 4f 52 43 45 5f 57 41   ENABLE_FORCE_WA
1ac90 4c 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 72  L.  if( db && !r
1aca0 63 20 29 7b 0a 20 20 20 20 69 66 20 28 28 30 20  c ){.    if ((0 
1acb0 3d 3d 20 61 63 63 65 73 73 28 22 2f 76 61 72 2f  == access("/var/
1acc0 64 62 2f 65 6e 61 62 6c 65 46 6f 72 63 65 57 41  db/enableForceWA
1acd0 4c 22 2c 20 52 5f 4f 4b 29 29 29 20 7b 0a 23 69  L", R_OK))) {.#i
1ace0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1acf0 47 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  G.      fprintf(
1ad00 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74 65 20  stderr, "SQLite 
1ad10 57 41 4c 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  WAL journal_mode
1ad20 20 45 4e 41 42 4c 45 44 20 62 79 20 64 65 66 61   ENABLED by defa
1ad30 75 6c 74 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66  ult.\n");.#endif
1ad40 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 73 71  .      .      sq
1ad50 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
1ad60 70 72 61 67 6d 61 20 6a 6f 75 72 6e 61 6c 5f 6d  pragma journal_m
1ad70 6f 64 65 3d 77 61 6c 22 2c 20 4e 55 4c 4c 2c 20  ode=wal", NULL, 
1ad80 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 23 69 66  NULL, NULL);.#if
1ad90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ada0 0a 2f 2f 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .//    } else {.
1adb0 2f 2f 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  //      fprintf(
1adc0 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74 65 20  stderr, "SQLite 
1add0 57 41 4c 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  WAL journal_mode
1ade0 20 4e 4f 54 20 45 4e 41 42 4c 45 44 20 62 79 20   NOT ENABLED by 
1adf0 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a 23 65  default.\n");.#e
1ae00 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ndif.    }.  }.#
1ae10 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
1ae20 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1ae30 41 55 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 20 20  AUTO_PROFILE).  
1ae40 69 66 28 20 64 62 20 26 26 20 21 72 63 20 29 7b  if( db && !rc ){
1ae50 0a 20 20 20 20 65 6e 61 62 6c 65 41 75 74 6f 4c  .    enableAutoL
1ae60 6f 67 67 69 6e 67 28 64 62 29 3b 0a 20 20 7d 0a  ogging(db);.  }.
1ae70 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
1ae80 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   db;.#ifdef SQLI
1ae90 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a  TE_ENABLE_SQLRR.
1aea0 20 20 53 52 52 65 63 4f 70 65 6e 28 64 62 2c 20    SRRecOpen(db, 
1aeb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73  zFilename, flags
1aec0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
1aed0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1aee0 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
1aef0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1af00 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
1af10 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68  * Opening a db h
1af20 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
1af30 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
1af40 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  d 0. */.    void
1af50 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33   *pArg = sqlite3
1af60 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
1af70 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c  llogArg;.    sql
1af80 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1af90 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64  .xSqllog(pArg, d
1afa0 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  b, zFilename, 0)
1afb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
1afc0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1afd0 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69 66 28  HAS_CODEC).  if(
1afe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1aff0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1b000 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69 66 28 20   *zKey;.    if( 
1b010 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
1b020 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f  uri_parameter(zO
1b030 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29 29 21  pen, "hexkey"))!
1b040 3d 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20 29 7b  =0 && zKey[0] ){
1b050 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65 3b  .      u8 iByte;
1b060 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1b070 20 20 20 20 63 68 61 72 20 7a 44 65 63 6f 64 65      char zDecode
1b080 64 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72  d[40];.      for
1b090 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69  (i=0, iByte=0; i
1b0a0 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64 65 64  <sizeof(zDecoded
1b0b0 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73  )*2 && sqlite3Is
1b0c0 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d 29 3b  xdigit(zKey[i]);
1b0d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1b0e0 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34  Byte = (iByte<<4
1b0f0 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f  ) + sqlite3HexTo
1b100 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20 20  Int(zKey[i]);.  
1b110 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21        if( (i&1)!
1b120 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b 69 2f  =0 ) zDecoded[i/
1b130 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20  2] = iByte;.    
1b140 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1b150 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20  3_key_v2(db, 0, 
1b160 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32 29 3b 0a  zDecoded, i/2);.
1b170 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a      }else if( (z
1b180 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  Key = sqlite3_ur
1b190 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65  i_parameter(zOpe
1b1a0 6e 2c 20 22 6b 65 79 22 29 29 21 3d 30 20 29 7b  n, "key"))!=0 ){
1b1b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  .      sqlite3_k
1b1c0 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a 4b 65  ey_v2(db, 0, zKe
1b1d0 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  y, sqlite3Strlen
1b1e0 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20 20 7d  30(zKey));.    }
1b1f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
1b200 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e  lite3_free(zOpen
1b210 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26  );.  return rc &
1b220 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
1b230 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
1b240 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
1b250 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  nt sqlite3_open(
1b260 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b270 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
1b280 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a  ite3 **ppDb .){.
1b290 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
1b2a0 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  abase(zFilename,
1b2b0 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1b2d0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1b2e0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1b2f0 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69  _CREATE, 0);.}.i
1b300 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
1b310 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v2(.  const char
1b320 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a   *filename,   /*
1b330 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
1b340 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  me (UTF-8) */.  
1b350 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
1b360 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1b370 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65  SQLite db handle
1b380 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b3a0 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   Flags */.  cons
1b3b0 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
1b3c0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
1b3d0 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65  FS module to use
1b3e0 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1b3f0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c  openDatabase(fil
1b400 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e  ename, ppDb, (un
1b410 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73  signed int)flags
1b420 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
1b430 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b440 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
1b450 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
1b460 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
1b470 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
1b480 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1b490 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
1b4a0 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
1b4b0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
1b4c0 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
1b4d0 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
1b4e0 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
1b4f0 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
1b500 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
1b510 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  l;.  int rc;..#i
1b520 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b530 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1b540 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74  f( ppDb==0 ) ret
1b550 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1b560 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1b570 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
1b580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b590 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
1b5a0 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1b5b0 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
1b5c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
1b5d0 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  if.  if( zFilena
1b5e0 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d  me==0 ) zFilenam
1b5f0 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a  e = "\000\000";.
1b600 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
1b610 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
1b620 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
1b630 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c  r(pVal, -1, zFil
1b640 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  ename, SQLITE_UT
1b650 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54  F16NATIVE, SQLIT
1b660 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69  E_STATIC);.  zFi
1b670 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65  lename8 = sqlite
1b680 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
1b690 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1b6a0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20   if( zFilename8 
1b6b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
1b6c0 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
1b6d0 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  me8, ppDb,.     
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1b700 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1b710 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
1b720 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
1b730 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  Db || rc==SQLITE
1b740 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66  _NOMEM );.    if
1b750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b760 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
1b770 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53  y(*ppDb, 0, DB_S
1b780 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
1b790 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43        SCHEMA_ENC
1b7a0 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a 70  (*ppDb) = ENC(*p
1b7b0 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
1b7c0 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
1b7d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1b7e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1b7f0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
1b800 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
1b810 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
1b820 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69   & 0xff;.}.#endi
1b830 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b840 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
1b850 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1b860 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b870 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1b880 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1b890 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1b8a0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1b8b0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1b8c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b8d0 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1b8e0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1b8f0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1b900 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1b910 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1b920 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65  t void*).){.  re
1b930 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
1b940 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
1b950 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c  (db, zName, enc,
1b960 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
1b970 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
1b980 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
1b990 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b9a0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1b9b0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
1b9c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
1b9d0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
1b9e0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1b9f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ba00 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1ba10 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1ba20 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1ba30 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1ba40 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1ba50 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
1ba60 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
1ba70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
1ba80 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ba90 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1baa0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1bab0 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1bac0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
1bad0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1bae0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1baf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1bb00 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1bb10 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
1bb20 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
1bb30 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
1bb40 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
1bb50 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
1bb60 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
1bb70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1bb80 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1bb90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1bba0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1bbb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bbc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bbd0 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1bbe0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
1bbf0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1bc00 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
1bc10 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
1bc20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
1bc30 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
1bc40 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1bc50 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
1bc60 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
1bc70 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1bc80 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1bc90 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1bca0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1bcb0 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
1bcc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1bcd0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
1bce0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1bcf0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1bd00 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1bd10 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1bd20 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
1bd30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1bd40 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1bd50 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1bd60 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1bd70 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
1bd80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1bd90 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
1bda0 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
1bdb0 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
1bdc0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
1bdd0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
1bde0 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
1bdf0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
1be00 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
1be10 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
1be20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
1be30 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
1be40 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
1be50 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
1be60 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
1be70 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1be80 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1be90 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1bea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1beb0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
1bec0 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
1bed0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
1bee0 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
1bef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1bf00 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
1bf10 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
1bf20 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
1bf30 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1bf40 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
1bf50 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
1bf60 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
1bf70 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
1bf80 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
1bf90 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
1bfa0 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
1bfb0 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1bfc0 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
1bfd0 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1bfe0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1bff0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1c000 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1c010 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1c020 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1c030 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1c040 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1c050 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1c060 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
1c070 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
1c080 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1c090 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
1c0a0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
1c0b0 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
1c0c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c0d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1c0e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c0f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1c100 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
1c110 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
1c120 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c130 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
1c140 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
1c150 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
1c160 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
1c170 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
1c180 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1c190 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1c1a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1c1b0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
1c1c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1c1d0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
1c1e0 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
1c1f0 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
1c200 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
1c210 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
1c220 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69  nst void*).){.#i
1c230 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c240 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1c250 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1c260 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1c270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1c280 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1c290 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c2a0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1c2b0 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
1c2c0 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
1c2d0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1c2e0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
1c2f0 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
1c300 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
1c310 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
1c320 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1c330 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1c340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1c350 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1c360 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
1c370 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c380 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
1c390 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c3a0 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
1c3b0 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
1c3c0 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
1c3d0 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
1c3e0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1c3f0 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
1c400 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
1c410 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
1c420 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
1c430 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
1c440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c450 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
1c460 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
1c470 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1c480 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1c490 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
1c4a0 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
1c4b0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1c4c0 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
1c4d0 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
1c4e0 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
1c4f0 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
1c500 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
1c510 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
1c520 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
1c530 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
1c540 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
1c550 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69  r ROLLBACK..*/.i
1c560 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
1c570 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
1c580 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
1c590 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1c5a0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1c5b0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1c5c0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1c5d0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1c5e0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1c5f0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
1c600 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
1c610 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  toCommit;.}../*.
1c620 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1c630 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75   routines are su
1c640 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f  bstitutes for co
1c650 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43  nstants SQLITE_C
1c660 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54  ORRUPT,.** SQLIT
1c670 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45  E_MISUSE, SQLITE
1c680 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54  _CANTOPEN, SQLIT
1c690 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73 73  E_NOMEM and poss
1c6a0 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72  ibly other error
1c6b0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20  .** constants.  
1c6c0 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70  They serve two p
1c6d0 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  urposes:.**.**  
1c6e0 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20   1.  Serve as a 
1c6f0 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
1c700 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
1c710 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67  oint in a debugg
1c720 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64  er.**       to d
1c730 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69  etect when versi
1c740 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  on error conditi
1c750 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ons occurs..**.*
1c760 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73  *   2.  Invoke s
1c770 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20  qlite3_log() to 
1c780 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72  provide the sour
1c790 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e  ce code location
1c7a0 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20   where.**       
1c7b0 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  a low-level erro
1c7c0 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  r is first detec
1c7d0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1c7e0 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 69  te3ReportError(i
1c7f0 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69 6e  nt iErr, int lin
1c800 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  eno, const char 
1c810 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  *zType){.  sqlit
1c820 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25 73  e3_log(iErr, "%s
1c830 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
1c840 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
1c850 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c 69         zType, li
1c860 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
1c870 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
1c880 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a 69  return iErr;.}.i
1c890 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
1c8a0 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  tError(int linen
1c8b0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1c8c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c8d0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1c8e0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1c8f0 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1c900 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e  E_CORRUPT, linen
1c910 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f 72  o, "database cor
1c920 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e 74  ruption");.}.int
1c930 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
1c940 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1c950 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1c960 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1c970 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1c980 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1c990 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4d  rtError(SQLITE_M
1c9a0 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20 22  ISUSE, lineno, "
1c9b0 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74 20  misuse");.}.int 
1c9c0 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
1c9d0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1c9e0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1c9f0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ca00 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1ca10 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1ca20 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1ca30 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f  CANTOPEN, lineno
1ca40 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  , "cannot open f
1ca50 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66 20  ile");.}.#ifdef 
1ca60 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
1ca70 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 50   sqlite3CorruptP
1ca80 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  gnoError(int lin
1ca90 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  eno, Pgno pgno){
1caa0 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31 30 30  .  char zMsg[100
1cab0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
1cac0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4d 73  rintf(sizeof(zMs
1cad0 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74 61 62  g), zMsg, "datab
1cae0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 70  ase corruption p
1caf0 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29 3b 0a  age %d", pgno);.
1cb00 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1cb10 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cb20 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1cb30 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1cb40 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f  tError(SQLITE_CO
1cb50 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a  RRUPT, lineno, z
1cb60 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Msg);.}.int sqli
1cb70 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e  te3NomemError(in
1cb80 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1cb90 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1cba0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1cbb0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
1cbc0 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1cbd0 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  r(SQLITE_NOMEM, 
1cbe0 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a  lineno, "OOM");.
1cbf0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f 65  }.int sqlite3Ioe
1cc00 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74  rrnomemError(int
1cc10 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1cc20 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1cc30 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1cc40 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
1cc50 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1cc60 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  (SQLITE_IOERR_NO
1cc70 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f  MEM, lineno, "I/
1cc80 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a 7d  O OOM error");.}
1cc90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1cca0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
1ccb0 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
1ccc0 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65  is is a convenie
1ccd0 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74  nce routine that
1cce0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
1ccf0 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63   all thread-spec
1cd00 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72  ific.** data for
1cd10 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73   this thread has
1cd20 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   been deallocate
1cd30 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  d..**.** SQLite 
1cd40 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74  no longer uses t
1cd50 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64  hread-specific d
1cd60 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ata so this rout
1cd70 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20  ine is now a.** 
1cd80 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65  no-op.  It is re
1cd90 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f  tained for histo
1cda0 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c  rical compatibil
1cdb0 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
1cdc0 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
1cdd0 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e  nup(void){.}.#en
1cde0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
1cdf0 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  n meta informati
1ce00 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69  on about a speci
1ce10 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  fic column of a 
1ce20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
1ce30 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69  ** See comment i
1ce40 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c  n sqlite3.h (sql
1ce50 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65  ite.h.in) for de
1ce60 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tails..*/.int sq
1ce70 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
1ce80 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73  mn_metadata(.  s
1ce90 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1cea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1ceb0 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
1cec0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1ced0 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20  *zDbName,       
1cee0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
1cef0 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  e or NULL */.  c
1cf00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
1cf10 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61  eName,     /* Ta
1cf20 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ble name */.  co
1cf30 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1cf40 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c  nName,    /* Col
1cf50 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
1cf60 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74  ar const **pzDat
1cf70 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54  aType,    /* OUT
1cf80 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61  PUT: Declared da
1cf90 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  ta type */.  cha
1cfa0 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c  r const **pzColl
1cfb0 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50  Seq,     /* OUTP
1cfc0 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  UT: Collation se
1cfd0 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20  quence name */. 
1cfe0 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20   int *pNotNull, 
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d000 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
1d010 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
1d020 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  int exists */.  
1d030 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  int *pPrimaryKey
1d040 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
1d050 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
1d060 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b  olumn part of PK
1d070 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f   */.  int *pAuto
1d080 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  inc             
1d090 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1d0a0 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61  e if column is a
1d0b0 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f  uto-increment */
1d0c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1d0d0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
1d0e0 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
1d0f0 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
1d100 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
1d110 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72  iCol = 0;.  char
1d120 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
1d130 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
1d140 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
1d150 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
1d160 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
1d170 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
1d180 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
1d190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1d1a0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1d1b0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1d1c0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1d1d0 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30  || zTableName==0
1d1e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1d1f0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1d200 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1d210 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
1d220 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
1d230 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
1d240 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1d250 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1d260 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
1d270 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
1d280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
1d290 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29  it(db, &zErrMsg)
1d2a0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1d2b0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  K!=rc ){.    got
1d2c0 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1d2d0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
1d2e0 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74  e table in quest
1d2f0 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  ion */.  pTab = 
1d300 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1d310 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
1d320 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1d330 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e   !pTab || pTab->
1d340 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
1d350 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  Tab = 0;.    got
1d360 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1d370 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
1d380 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68  column for which
1d390 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74   info is request
1d3a0 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c  ed */.  if( zCol
1d3b0 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  umnName==0 ){.  
1d3c0 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 65    /* Query for e
1d3d0 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62 6c  xistance of tabl
1d3e0 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73  e only */.  }els
1d3f0 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  e{.    for(iCol=
1d400 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
1d410 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
1d420 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
1d430 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
1d440 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
1d450 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
1d460 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d  Name, zColumnNam
1d470 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
1d480 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1d490 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
1d4a0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
1d4b0 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
1d4c0 64 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  d(pTab) && sqlit
1d4d0 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d  e3IsRowid(zColum
1d4e0 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
1d4f0 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
1d500 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  PKey;.        pC
1d510 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26  ol = iCol>=0 ? &
1d520 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
1d530 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   : 0;.      }els
1d540 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  e{.        pTab 
1d550 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
1d560 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1d570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d580 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1d590 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20  ng block stores 
1d5a0 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  the meta informa
1d5b0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62  tion that will b
1d5c0 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  e returned.  ** 
1d5d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  to the caller in
1d5e0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
1d5f0 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c   zDataType, zCol
1d600 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70  lSeq, notnull, p
1d610 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61  rimarykey.  ** a
1d620 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74  nd autoinc. At t
1d630 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1d640 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c  are two possibil
1d650 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a  ities:.  ** .  *
1d660 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65  *     1. The spe
1d670 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  cified column na
1d680 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22  me was rowid", "
1d690 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f  oid" or "_rowid_
1d6a0 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61  " .  **        a
1d6b0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65  nd there is no e
1d6c0 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
1d6d0 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a  ed IPK column. .
1d6e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e    **.  **     2.
1d6f0 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   The table is no
1d700 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  t a view and the
1d710 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65   column name ide
1d720 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a  ntified an .  **
1d730 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74          explicit
1d740 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
1d750 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e  mn. Copy meta in
1d760 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a  formation from *
1d770 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  pCol..  */ .  if
1d780 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44  ( pCol ){.    zD
1d790 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ataType = sqlite
1d7a0 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c  3ColumnType(pCol
1d7b0 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  ,0);.    zCollSe
1d7c0 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b  q = pCol->zColl;
1d7d0 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70  .    notnull = p
1d7e0 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b  Col->notNull!=0;
1d7f0 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
1d800 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61   = (pCol->colFla
1d810 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
1d820 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75  MKEY)!=0;.    au
1d830 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50  toinc = pTab->iP
1d840 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54  Key==iCol && (pT
1d850 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1d860 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
1d870 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
1d880 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
1d890 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
1d8a0 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
1d8b0 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
1d8c0 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
1d8d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1d8e0 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f  ARY;.  }..error_
1d8f0 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74  out:.  sqlite3Bt
1d900 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
1d910 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74  ..  /* Whether t
1d920 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
1d930 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61   succeeded or fa
1d940 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75  iled, set the ou
1d950 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a  tput parameters.
1d960 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72    ** to whatever
1d970 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75   their local cou
1d980 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69  nterparts contai
1d990 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  n. If an error d
1d9a0 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74  id occur,.  ** t
1d9b0 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65  his has the effe
1d9c0 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c  ct of zeroing al
1d9d0 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  l output paramet
1d9e0 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
1d9f0 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a  pzDataType ) *pz
1da00 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61  DataType = zData
1da10 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f  Type;.  if( pzCo
1da20 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53  llSeq ) *pzCollS
1da30 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20  eq = zCollSeq;. 
1da40 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20   if( pNotNull ) 
1da50 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e  *pNotNull = notn
1da60 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d  ull;.  if( pPrim
1da70 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61  aryKey ) *pPrima
1da80 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b  ryKey = primaryk
1da90 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69  ey;.  if( pAutoi
1daa0 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d  nc ) *pAutoinc =
1dab0 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28   autoinc;..  if(
1dac0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26   SQLITE_OK==rc &
1dad0 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73  & !pTab ){.    s
1dae0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1daf0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a   zErrMsg);.    z
1db00 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
1db10 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20  MPrintf(db, "no 
1db20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d  such table colum
1db30 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c  n: %s.%s", zTabl
1db40 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a  eName,.        z
1db50 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20  ColumnName);.   
1db60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1db70 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
1db80 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
1db90 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
1dba0 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
1dbb0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1dbc0 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
1dbd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
1dbe0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
1dbf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1dc00 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1dc10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dc20 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
1dc30 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
1dc40 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
1dc50 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
1dc60 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1dc70 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b  3_sleep(int ms){
1dc80 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1dc90 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
1dca0 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
1dcb0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1dcc0 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65  if( pVfs==0 ) re
1dcd0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  turn 0;..  /* Th
1dce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
1dcf0 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s in millisecond
1dd00 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72  s, but the under
1dd10 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20  lying OsSleep() 
1dd20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d  .  ** API uses m
1dd30 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e  icroseconds. Hen
1dd40 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20  ce the 1000's.. 
1dd50 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69   */.  rc = (sqli
1dd60 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c  te3OsSleep(pVfs,
1dd70 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b   1000*ms)/1000);
1dd80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dd90 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  ./*.** Enable or
1dda0 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74   disable the ext
1ddb0 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64  ended result cod
1ddc0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1ddd0 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
1dde0 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33  lt_codes(sqlite3
1ddf0 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29   *db, int onoff)
1de00 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1de10 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1de20 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1de30 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1de40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1de50 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1de60 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1de70 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1de80 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
1de90 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
1dea0 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
1deb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1dec0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1ded0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1dee0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1def0 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
1df00 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
1df10 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
1df20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
1df30 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1df40 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
1df50 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1df60 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
1df70 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
1df80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
1df90 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
1dfa0 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53  Btree;..#ifdef S
1dfb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1dfc0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1dfd0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1dfe0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1dff0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1e000 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1e010 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e020 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
1e030 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  Btree = sqlite3D
1e040 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1e050 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1e060 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50   pBtree ){.    P
1e070 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
1e080 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1e090 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  fd;.    sqlite3B
1e0a0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1e0b0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
1e0c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
1e0d0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61  r(pBtree);.    a
1e0e0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1e0f0 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c   );.    fd = sql
1e100 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
1e110 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
1e120 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
1e130 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1e140 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
1e150 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1e160 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
1e170 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20   = fd;.      rc 
1e180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1e190 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53   }else if( op==S
1e1a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f  QLITE_FCNTL_VFS_
1e1b0 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1e1c0 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a   *(sqlite3_vfs**
1e1d0 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50  )pArg = sqlite3P
1e1e0 61 67 65 72 56 66 73 28 70 50 61 67 65 72 29 3b  agerVfs(pPager);
1e1f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e200 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1e210 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1e220 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f  FCNTL_JOURNAL_PO
1e230 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1e240 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29  (sqlite3_file**)
1e250 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1e260 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67  gerJrnlFile(pPag
1e270 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1e280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 6e 64  SQLITE_OK;.#ifnd
1e290 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1e2a0 41 4c 0a 20 20 20 20 20 20 69 66 28 20 28 72 63  AL.      if( (rc
1e2b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 26 26 28 6f  ==SQLITE_OK)&&(o
1e2c0 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
1e2d0 4c 41 53 54 5f 45 52 52 4e 4f 29 26 26 28 2a 28  LAST_ERRNO)&&(*(
1e2e0 69 6e 74 20 2a 29 70 41 72 67 3d 3d 30 29 20 29  int *)pArg==0) )
1e2f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e300 33 5f 66 69 6c 65 20 2a 70 57 61 6c 46 64 20 3d  3_file *pWalFd =
1e310 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c   sqlite3PagerWal
1e320 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
1e330 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 46 64        if( pWalFd
1e340 26 26 28 70 57 61 6c 46 64 2d 3e 70 4d 65 74 68  &&(pWalFd->pMeth
1e350 6f 64 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ods) ){.        
1e360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e370 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 57 61 6c  FileControl(pWal
1e380 46 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  Fd, op, pArg);. 
1e390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e3a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1e3b0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1e3c0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
1e3d0 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29  ol(fd, op, pArg)
1e3e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1e3f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1e400 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tree);.  }.  sql
1e410 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
1e420 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1e430 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1e440 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1e450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
1e460 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74  face to the test
1e470 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e  ing logic..*/.in
1e480 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  t sqlite3_test_c
1e490 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e  ontrol(int op, .
1e4a0 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ..){.  int rc = 
1e4b0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
1e4c0 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 55 4e  _UNTESTABLE.  UN
1e4d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f  USED_PARAMETER(o
1e4e0 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c  p);.#else.  va_l
1e4f0 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1e500 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
1e510 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
1e520 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
1e530 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1e540 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
1e550 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e560 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1e570 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
1e580 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
1e590 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
1e5a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e5b0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
1e5c0 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
1e5d0 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
1e5e0 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
1e5f0 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
1e600 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
1e610 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
1e620 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
1e630 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
1e640 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
1e650 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
1e660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e670 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e680 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
1e690 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1e6a0 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
1e6b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e6c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1e6d0 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
1e6e0 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
1e6f0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
1e700 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
1e710 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
1e720 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1e730 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
1e740 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
1e750 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
1e760 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
1e770 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
1e780 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
1e790 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1e7a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1e7b0 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
1e7c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
1e7d0 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
1e7e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e7f0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1e800 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e810 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
1e820 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
1e830 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1e840 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
1e850 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
1e860 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
1e870 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
1e880 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
1e890 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
1e8a0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
1e8b0 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
1e8c0 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
1e8d0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1e8e0 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
1e8f0 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
1e900 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
1e910 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
1e920 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
1e930 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
1e940 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1e950 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1e960 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e970 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
1e980 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
1e990 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
1e9a0 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
1e9b0 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
1e9c0 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
1e9d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
1e9e0 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
1e9f0 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
1ea00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ea10 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1ea20 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1ea30 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c  l(FAULT_INSTALL,
1ea40 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20   xCallback).    
1ea50 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67  **.    ** Arrang
1ea60 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c  e to invoke xCal
1ea70 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72  lback() whenever
1ea80 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1ea90 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20  () is called,.  
1eaa0 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63    ** if xCallbac
1eab0 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  k is not NULL.. 
1eac0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20     **.    ** As 
1ead0 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61  a test of the fa
1eae0 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65  ult simulator me
1eaf0 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20  chanism itself, 
1eb00 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1eb10 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c  0).    ** is cal
1eb20 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  led immediately 
1eb30 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67  after installing
1eb40 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63   the new callbac
1eb50 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  k and the return
1eb60 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72  .    ** value fr
1eb70 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  om sqlite3FaultS
1eb80 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68  im(0) becomes th
1eb90 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20  e return from.  
1eba0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
1ebb0 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20  t_control()..   
1ebc0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ebd0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
1ebe0 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20  LT_INSTALL: {.  
1ebf0 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
1ec00 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
1ec10 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
1ec20 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
1ec30 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
1ec40 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
1ec50 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
1ec60 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
1ec70 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c  lConfig.xTestCal
1ec80 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61  lback = va_arg(a
1ec90 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b  p, int(*)(int));
1eca0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ecb0 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53  typedef int(*TES
1ecc0 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1ecd0 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (int);.      sql
1ece0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ecf0 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
1ed00 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54   va_arg(ap, TEST
1ed10 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b  CALLBACKFUNC_t);
1ed20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ed30 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a  te3FaultSim(0);.
1ed40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ed50 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1ed60 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1ed70 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
1ed80 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
1ed90 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
1eda0 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
1edb0 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
1edc0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
1edd0 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
1ede0 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
1edf0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
1ee00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1ee10 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
1ee20 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
1ee30 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1ee40 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
1ee50 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
1ee60 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1ee70 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
1ee80 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
1ee90 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
1eea0 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
1eeb0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1eec0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
1eed0 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
1eee0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1eef0 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1ef00 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
1ef10 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
1ef20 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
1ef30 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
1ef40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1ef50 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1ef60 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1ef70 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1ef80 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
1ef90 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
1efa0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1efb0 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
1efc0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
1efd0 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
1efe0 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
1eff0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
1f000 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
1f010 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
1f020 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
1f030 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
1f040 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1f050 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
1f060 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
1f070 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
1f080 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
1f090 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
1f0a0 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
1f0b0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
1f0c0 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
1f0d0 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
1f0e0 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1f0f0 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
1f100 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
1f110 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
1f120 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
1f130 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
1f140 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62  ** deleterious b
1f150 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
1f160 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f170 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
1f180 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
1f190 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
1f1a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1f1b0 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
1f1c0 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
1f1d0 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
1f1e0 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
1f1f0 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
1f200 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
1f210 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
1f220 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
1f230 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1f240 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1f250 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1f260 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1f270 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1f280 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
1f290 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1f2a0 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1f2b0 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1f2c0 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
1f2d0 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
1f2e0 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
1f2f0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
1f300 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
1f310 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
1f320 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
1f330 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1f340 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1f350 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
1f360 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
1f370 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1f380 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1f390 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1f3a0 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
1f3b0 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
1f3c0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1f3d0 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
1f3e0 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
1f3f0 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
1f400 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
1f410 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
1f420 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1f430 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
1f440 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1f450 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
1f460 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f470 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
1f480 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
1f490 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
1f4a0 20 20 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64     assert( /*sid
1f4b0 65 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28  e-effects-ok*/ (
1f4c0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1f4d0 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  t))!=0 );.      
1f4e0 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72  rc = x;.      br
1f4f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
1f500 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1f510 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1f520 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1f530 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a  _ALWAYS, int X).
1f540 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f550 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
1f560 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
1f570 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68  st to see how th
1f580 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20  e ALWAYS and.   
1f590 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73   ** NEVER macros
1f5a0 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74   were defined at
1f5b0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20   compile-time.. 
1f5c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1f5d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1f5e0 20 41 4c 57 41 59 53 28 58 29 20 69 66 20 58 20   ALWAYS(X) if X 
1f5f0 69 73 20 74 72 75 65 2c 20 6f 72 20 30 20 69 66  is true, or 0 if
1f600 20 58 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   X is false..   
1f610 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1f620 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20  ecommended test 
1f630 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65  is X==2.  If the
1f640 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1f650 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20   2, that means. 
1f660 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61     ** ALWAYS() a
1f670 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62  nd NEVER() are b
1f680 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  oth no-op pass-t
1f690 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77  hrough macros, w
1f6a0 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20  hich is the.    
1f6b0 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  ** default setti
1f6c0 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  ng.  If the retu
1f6d0 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74  rn value is 1, t
1f6e0 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20  hen ALWAYS() is 
1f6f0 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61  either.    ** ha
1f700 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
1f710 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65   or else it asse
1f720 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d  rts if its argum
1f730 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  ent is false..  
1f740 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62    ** The first b
1f750 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f  ehavior (hard-co
1f760 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20  ded to true) is 
1f770 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
1f780 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
1f790 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
1f7a0 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
1f7b0 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68   disabled and th
1f7c0 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
1f7d0 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74  behavior (assert
1f7e0 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
1f7f0 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20   to ALWAYS() is 
1f800 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61  false) is the ca
1f810 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
1f820 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1f830 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
1f840 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
1f850 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1f860 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74  * The run-time t
1f870 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69  est procedure mi
1f880 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69  ght look somethi
1f890 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ng like this:.  
1f8a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69    **.    **    i
1f8b0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
1f8c0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1f8d0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
1f8e0 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20  2)==2 ){.    ** 
1f8f0 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29       // ALWAYS()
1f900 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
1f910 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1f920 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a  ugh macros.    *
1f930 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  *    }else if( s
1f940 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f950 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f960 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29  TRL_ASSERT, 1) )
1f970 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1f980 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72   ALWAYS(x) asser
1f990 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75  ts that x is tru
1f9a0 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65  e. NEVER(x) asse
1f9b0 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a  rts x is false..
1f9c0 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b      **    }else{
1f9d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1f9e0 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63  ALWAYS(x) is a c
1f9f0 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45  onstant 1.  NEVE
1fa00 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61  R(x) is a consta
1fa10 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20  nt 0..    **    
1fa20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  }.    */.    cas
1fa30 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1fa40 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20  L_ALWAYS: {.    
1fa50 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
1fa60 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1fa70 72 63 20 3d 20 78 20 3f 20 41 4c 57 41 59 53 28  rc = x ? ALWAYS(
1fa80 78 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72  x) : 0;.      br
1fa90 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1faa0 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69  /*.    **   sqli
1fab0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1fac0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1fad0 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20  _BYTEORDER);.   
1fae0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69   **.    ** The i
1faf0 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20  nteger returned 
1fb00 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65  reveals the byte
1fb10 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f  -order of the co
1fb20 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a  mputer on which.
1fb30 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73      ** SQLite is
1fb40 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a   running:.    **
1fb50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20  .    **       1 
1fb60 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1fb70 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1fb80 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a   run-time.    **
1fb90 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74        10     lit
1fba0 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65  tle-endian, dete
1fbb0 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
1fbc0 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30  me.    **  43210
1fbd0 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
1fbe0 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
1fbf0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
1fc00 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20      **  123410  
1fc10 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
1fc20 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
1fc30 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
1fc40 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51   */ .    case SQ
1fc50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
1fc60 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20  TEORDER: {.     
1fc70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54   rc = SQLITE_BYT
1fc80 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c  EORDER*100 + SQL
1fc90 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e  ITE_LITTLEENDIAN
1fca0 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47  *10 + SQLITE_BIG
1fcb0 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72  ENDIAN;.      br
1fcc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1fcd0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1fce0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1fcf0 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1fd00 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
1fd10 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1fd20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
1fd30 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
1fd40 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
1fd50 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
1fd60 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
1fd70 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
1fd80 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1fd90 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
1fda0 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
1fdb0 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1fdc0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1fdd0 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
1fde0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1fdf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1fe00 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1fe10 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
1fe20 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1fe30 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
1fe40 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
1fe50 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1fe60 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1fe70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fe80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
1fe90 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1fea0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1feb0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
1fec0 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
1fed0 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1fee0 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
1fef0 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
1ff00 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
1ff10 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
1ff20 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
1ff30 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
1ff40 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
1ff50 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
1ff60 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
1ff70 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
1ff80 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
1ff90 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
1ffa0 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
1ffb0 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
1ffc0 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
1ffd0 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
1ffe0 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
1fff0 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
20000 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
20010 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
20020 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
20030 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
20040 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
20050 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
20060 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
20070 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
20080 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20090 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
200a0 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
200b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
200c0 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
200d0 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64  3*);.      db->d
200e0 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36  bOptFlags = (u16
200f0 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  )(va_arg(ap, int
20100 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20  ) & 0xffff);.   
20110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20120 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
20130 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
20140 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
20150 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20  OCALTIME_FAULT, 
20160 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  int onoff);.    
20170 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72  **.    ** If par
20180 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20  ameter onoff is 
20190 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67  non-zero, config
201a0 75 72 65 20 74 68 65 20 77 72 61 70 70 65 72 73  ure the wrappers
201b0 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20   so that all.   
201c0 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63   ** subsequent c
201d0 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d  alls to localtim
201e0 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73  e() and variants
201f0 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20   fail. If onoff 
20200 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20  is zero,.    ** 
20210 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e  undo this settin
20220 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  g..    */.    ca
20230 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
20240 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
20250 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LT: {.      sqli
20260 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
20270 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20  bLocaltimeFault 
20280 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
20290 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
202a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
202b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
202c0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
202d0 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
202e0 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a  PT, int);.    **
202f0 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63  .    ** Set or c
20300 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68 61 74  lear a flag that
20310 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
20320 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20330 65 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c  e is always well
20340 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20  -.    ** formed 
20350 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70  and never corrup
20360 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73  t.  This flag is
20370 20 63 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c   clear by defaul
20380 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  t, indicating th
20390 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  at.    ** databa
203a0 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68  se files might h
203b0 61 76 65 20 61 72 62 69 74 72 61 72 79 20 63 6f  ave arbitrary co
203c0 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69  rruption.  Setti
203d0 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75 72 69  ng the flag duri
203e0 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e  ng.    ** testin
203f0 67 20 63 61 75 73 65 73 20 63 65 72 74 61 69 6e  g causes certain
20400 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
20410 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65  ents in the code
20420 20 74 6f 20 62 65 20 61 63 74 69 76 61 74 65 64   to be activated
20430 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d  .    ** that dem
20440 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e  onstrat invarian
20450 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65  ts on well-forme
20460 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
20470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
20480 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
20490 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a  L_NEVER_CORRUPT:
204a0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
204b0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76  GlobalConfig.nev
204c0 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61  erCorrupt = va_a
204d0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
204e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
204f0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
20500 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77 68 69  threshold at whi
20510 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e 74  ch OP_Once count
20520 65 72 73 20 72 65 73 65 74 20 62 61 63 6b 20 74  ers reset back t
20530 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 20 42  o zero..    ** B
20540 79 20 64 65 66 61 75 6c 74 20 74 68 69 73 20 69  y default this i
20550 73 20 30 78 37 66 66 66 66 66 66 65 20 28 6f 76  s 0x7ffffffe (ov
20560 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c 20 62  er 2 billion), b
20570 75 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 73  ut that value is
20580 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69 67 20  .    ** too big 
20590 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72 65 61  to test in a rea
205a0 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74 20 6f  sonable amount o
205b0 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69 73 20  f time, so this 
205c0 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20 20 2a  control is.    *
205d0 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20 73 65  * provided to se
205e0 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20 65 61  t a small and ea
205f0 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65 20 72  sily reachable r
20600 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20 20 20  eset value..    
20610 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
20620 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e 43 45  TE_TESTCTRL_ONCE
20630 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f 4c 44  _RESET_THRESHOLD
20640 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
20650 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 4f  3GlobalConfig.iO
20660 6e 63 65 52 65 73 65 74 54 68 72 65 73 68 6f 6c  nceResetThreshol
20670 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  d = va_arg(ap, i
20680 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
20690 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
206a0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
206b0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
206c0 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45  STCTRL_VDBE_COVE
206d0 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c  RAGE, xCallback,
206e0 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   ptr);.    **.  
206f0 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42    ** Set the VDB
20700 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62  E coverage callb
20710 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ack function to 
20720 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63  xCallback with c
20730 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70  ontext .    ** p
20740 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20  ointer ptr..    
20750 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
20760 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45  TE_TESTCTRL_VDBE
20770 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66  _COVERAGE: {.#if
20780 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
20790 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 74  COVERAGE.      t
207a0 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72  ypedef void (*br
207b0 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76  anch_callback)(v
207c0 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b  oid*,int,u8,u8);
207d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
207e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65  obalConfig.xVdbe
207f0 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28  Branch = va_arg(
20800 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61  ap,branch_callba
20810 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ck);.      sqlit
20820 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
20830 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20  VdbeBranchArg = 
20840 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29  va_arg(ap,void*)
20850 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  ;.#endif.      b
20860 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
20870 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
20880 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
20890 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
208a0 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78  R_MMAP, db, nMax
208b0 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ); */.    case S
208c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
208d0 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20  ORTER_MMAP: {.  
208e0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
208f0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
20900 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
20910 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
20920 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
20930 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
20940 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
20950 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
20960 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
20970 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20  TCTRL_ISINIT);. 
20980 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74     **.    ** Ret
20990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
209a0 20 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e   SQLite has been
209b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
209c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
209d0 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20  .    ** not..   
209e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
209f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
20a00 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NIT: {.      if(
20a10 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20a20 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29  nfig.isInit==0 )
20a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
20a40 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
20a50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
20a60 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
20a70 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
20a80 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64  CTRL_IMPOSTER, d
20a90 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66  b, dbName, onOff
20aa0 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a  , tnum);.    **.
20ab0 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
20ac0 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64   control is used
20ad0 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73   to create impos
20ae0 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62  ter tables.  "db
20af0 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20  " is a pointer. 
20b00 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74     ** to the dat
20b10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
20b20 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65  .  dbName is the
20b30 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28   database name (
20b40 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20  ex: "main" or.  
20b50 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69    ** "temp") whi
20b60 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20  ch will receive 
20b70 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22  the imposter.  "
20b80 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70  onOff" turns imp
20b90 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20  oster mode on.  
20ba0 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74    ** or off.  "t
20bb0 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74  num" is the root
20bc0 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
20bd0 72 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ree to which the
20be0 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a   imposter.    **
20bf0 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f   table should co
20c00 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  nnect..    **.  
20c10 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f    ** Enable impo
20c20 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77  ster mode only w
20c30 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68  hen the schema h
20c40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
20c50 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20  parsed.  Then.  
20c60 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c    ** run a singl
20c70 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
20c80 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73  tatement to cons
20c90 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74  truct the impost
20ca0 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20  er table in.    
20cb0 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63  ** the parsed sc
20cc0 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e  hema.  Then turn
20cd0 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62   imposter mode b
20ce0 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20  ack off again.. 
20cf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
20d00 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75  onOff==0 and tnu
20d10 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  m>0 then reset t
20d20 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c  he schema for al
20d30 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75  l databases, cau
20d40 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  sing.    ** the 
20d50 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70  schema to be rep
20d60 61 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74  arsed the next t
20d70 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64  ime it is needed
20d80 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a  .  This has the.
20d90 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66      ** effect of
20da0 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70   erasing all imp
20db0 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20  oster tables..  
20dc0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
20dd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
20de0 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  POSTER: {.      
20df0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
20e00 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
20e10 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
20e20 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
20e30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
20e40 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73  db->init.iDb = s
20e50 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
20e60 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63  (db, va_arg(ap,c
20e70 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20  onst char*));.  
20e80 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
20e90 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  y = db->init.imp
20ea0 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f  osterTable = va_
20eb0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
20ec0 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54     db->init.newT
20ed0 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  num = va_arg(ap,
20ee0 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  int);.      if( 
20ef0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
20f00 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
20f10 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  Tnum>0 ){.      
20f20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
20f30 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
20f40 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20  tion(db);.      
20f50 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
20f60 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
20f70 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
20f80 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
20f90 64 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41  defined(YYCOVERA
20fa0 47 45 29 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69  GE).    /*  sqli
20fb0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
20fc0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
20fd0 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45  _PARSER_COVERAGE
20fe0 2c 20 46 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20  , FILE *out).   
20ff0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
21000 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e  test control (on
21010 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68 65  ly available whe
21020 6e 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  n SQLite is comp
21030 69 6c 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  iled with.    **
21040 20 2d 44 59 59 43 4f 56 45 52 41 47 45 29 20 77   -DYYCOVERAGE) w
21050 72 69 74 65 73 20 61 20 72 65 70 6f 72 74 20 6f  rites a report o
21060 6e 74 6f 20 22 6f 75 74 22 20 74 68 61 74 20 73  nto "out" that s
21070 68 6f 77 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  hows all.    ** 
21080 73 74 61 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20  state/lookahead 
21090 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20  combinations in 
210a0 74 68 65 20 70 61 72 73 65 72 20 73 74 61 74 65  the parser state
210b0 20 6d 61 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20   machine.    ** 
210c0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
210d0 65 78 65 72 63 69 73 65 64 2e 20 20 49 66 20 61  exercised.  If a
210e0 6e 79 20 73 74 61 74 65 20 69 73 20 6d 69 73 73  ny state is miss
210f0 65 64 2c 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  ed, make the.   
21100 20 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 20   ** return code 
21110 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
21120 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
21130 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
21140 52 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b  RSER_COVERAGE: {
21150 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  .      FILE *out
21160 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 46 49   = va_arg(ap, FI
21170 4c 45 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LE*);.      if( 
21180 73 71 6c 69 74 65 33 50 61 72 73 65 72 43 6f 76  sqlite3ParserCov
21190 65 72 61 67 65 28 6f 75 74 29 20 29 20 72 63 20  erage(out) ) rc 
211a0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
211b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
211c0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   }.#endif /* def
211d0 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45 29  ined(YYCOVERAGE)
211e0 20 2a 2f 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64   */.  }.  va_end
211f0 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
21200 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c  SQLITE_UNTESTABL
21210 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  E */.  return rc
21220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
21230 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
21240 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
21250 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
21260 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
21270 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
21280 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
21290 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
212a0 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
212b0 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
212c0 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
212d0 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
212e0 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
212f0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
21300 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
21310 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
21320 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
21330 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
21340 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
21350 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
21360 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
21370 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
21380 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
21390 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
213a0 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
213b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
213c0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
213d0 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
213e0 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
213f0 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
21400 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
21410 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
21420 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
21430 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
21440 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
21450 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
21460 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
21470 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
21480 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
21490 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
214a0 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d  me==0 || zParam=
214b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
214c0 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
214d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
214e0 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
214f0 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65  while( zFilename
21500 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  [0] ){.    int x
21510 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e   = strcmp(zFilen
21520 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
21530 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
21540 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
21550 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
21560 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65     if( x==0 ) re
21570 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
21580 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d      zFilename +=
21590 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
215a0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
215b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
215c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
215d0 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
215e0 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
215f0 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ameter..*/.int s
21600 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
21610 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  an(const char *z
21620 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
21630 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e  char *zParam, in
21640 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73  t bDflt){.  cons
21650 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
21660 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
21670 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
21680 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20  ram);.  bDflt = 
21690 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75  bDflt!=0;.  retu
216a0 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65  rn z ? sqlite3Ge
216b0 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c  tBoolean(z, bDfl
216c0 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  t) : bDflt;.}../
216d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34  *.** Return a 64
216e0 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
216f0 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70  ue for a query p
21700 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c  arameter..*/.sql
21710 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
21720 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20  e3_uri_int64(.  
21730 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
21740 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c  ename,    /* Fil
21750 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20  ename as passed 
21760 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f  to xOpen */.  co
21770 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
21780 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70  ,       /* URI p
21790 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20  arameter sought 
217a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
217b0 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f  64 bDflt       /
217c0 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61  * return if para
217d0 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67  meter is missing
217e0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
217f0 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
21800 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
21810 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
21820 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  );.  sqlite3_int
21830 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26  64 v;.  if( z &&
21840 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
21850 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 30 20  ToI64(z, &v)==0 
21860 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
21870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
21880 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
21890 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
218a0 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
218b0 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
218c0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
218d0 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
218e0 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
218f0 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
21900 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
21910 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
21920 74 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20  t iDb = zDbName 
21930 3f 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  ? sqlite3FindDbN
21940 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
21950 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 69   : 0;.  return i
21960 44 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61  Db<0 ? 0 : db->a
21970 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a  Db[iDb].pBt;.}..
21980 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21990 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
219a0 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
219b0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
219c0 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
219d0 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
219e0 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
219f0 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
21a00 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
21a10 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
21a20 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
21a30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
21a40 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
21a50 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
21a60 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
21a70 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
21a80 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
21a90 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
21aa0 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
21ab0 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
21ac0 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
21ad0 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
21ae0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
21af0 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a  me(pBt) : 0;.}..
21b00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
21b10 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  f database is re
21b20 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20  ad-only or 0 if 
21b30 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74  read/write.  Ret
21b40 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20  urn -1 if.** no 
21b50 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78  such database ex
21b60 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
21b70 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
21b80 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
21b90 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
21ba0 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
21bb0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21bc0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
21bd0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
21be0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
21bf0 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
21c00 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
21c10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
21c20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42  .  }.#endif.  pB
21c30 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
21c40 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
21c50 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
21c60 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
21c70 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74  eeIsReadonly(pBt
21c80 29 20 3a 20 2d 31 3b 0a 7d 0a 23 69 66 20 28 53  ) : -1;.}.#if (S
21c90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
21ca0 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
21cb0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
21cc0 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
21cd0 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a 0a 2f  e3_private.h"../
21ce0 2a 20 0a 2a 2a 20 54 65 73 74 69 6e 67 20 61 20  * .** Testing a 
21cf0 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 73 71  file path for sq
21d00 6c 69 74 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  lite locks held 
21d10 62 79 20 61 20 70 72 6f 63 65 73 73 20 49 44 2e  by a process ID.
21d20 20 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c   .** Returns SQL
21d30 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e  ITE_LOCKSTATE_ON
21d40 20 69 66 20 6c 6f 63 6b 73 20 61 72 65 20 70 72   if locks are pr
21d50 65 73 65 6e 74 20 6f 6e 20 70 61 74 68 0a 2a 2a  esent on path.**
21d60 20 74 68 61 74 20 77 6f 75 6c 64 20 70 72 65 76   that would prev
21d70 65 6e 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ent writing to t
21d80 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
21d90 69 6e 74 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63  int _sqlite3_loc
21da0 6b 73 74 61 74 65 28 63 6f 6e 73 74 20 63 68 61  kstate(const cha
21db0 72 20 2a 70 61 74 68 2c 20 70 69 64 5f 74 20 70  r *path, pid_t p
21dc0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  id){.  sqlite3 *
21dd0 64 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 0a 20 20  db = NULL;.  .  
21de0 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  if( sqlite3_open
21df0 5f 76 32 28 70 61 74 68 2c 20 26 64 62 2c 20 53  _v2(path, &db, S
21e00 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
21e10 4e 4c 59 2c 20 4e 55 4c 4c 29 20 3d 3d 20 53 51  NLY, NULL) == SQ
21e20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4c  LITE_OK ){.    L
21e30 6f 63 6b 73 74 61 74 65 50 49 44 20 6c 6f 63 6b  ockstatePID lock
21e40 73 74 61 74 65 20 3d 20 7b 70 69 64 2c 20 2d 31  state = {pid, -1
21e50 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  };.    sqlite3_f
21e60 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
21e70 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  NULL, SQLITE_FCN
21e80 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44  TL_LOCKSTATE_PID
21e90 2c 20 26 6c 6f 63 6b 73 74 61 74 65 29 3b 0a 20  , &lockstate);. 
21ea0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
21eb0 28 64 62 29 3b 0a 20 20 20 20 69 6e 74 20 73 74  (db);.    int st
21ec0 61 74 65 20 3d 20 6c 6f 63 6b 73 74 61 74 65 2e  ate = lockstate.
21ed0 73 74 61 74 65 3b 0a 20 20 20 20 72 65 74 75 72  state;.    retur
21ee0 6e 20 73 74 61 74 65 3b 0a 20 20 7d 0a 20 20 69  n state;.  }.  i
21ef0 66 28 20 4e 55 4c 4c 21 3d 64 62 20 29 7b 20 0a  f( NULL!=db ){ .
21f00 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
21f10 65 28 64 62 29 3b 20 2f 2a 20 6e 65 65 64 20 74  e(db); /* need t
21f20 6f 20 63 6c 6f 73 65 20 65 76 65 6e 20 69 66 20  o close even if 
21f30 6f 70 65 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  open returns an 
21f40 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 0a 20 20 72  error */.  }.  r
21f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
21f60 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  KSTATE_ERROR;.}.
21f70 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
21f80 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
21f90 50 49 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  PI */..#ifdef SQ
21fa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
21fb0 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  SHOT./*.** Obtai
21fc0 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e  n a snapshot han
21fd0 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61 70  dle for the snap
21fe0 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73 65  shot of database
21ff0 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20 0a   zDb currently .
22000 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62 79  ** being read by
22010 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
22020 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  nt sqlite3_snaps
22030 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69 74  hot_get(.  sqlit
22040 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
22050 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71   char *zDb,.  sq
22060 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
22070 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20  *ppSnapshot.){. 
22080 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22090 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20  _ERROR;.#ifndef 
220a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
220b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
220c0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
220d0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
220e0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
220f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22100 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
22110 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
22120 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
22130 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
22140 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
22150 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mmit==0 ){.    i
22160 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
22170 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
22180 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
22190 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a  ==0 || iDb>1 ){.
221a0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
221b0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
221c0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 30  pBt;.      if( 0
221d0 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ==sqlite3BtreeIs
221e0 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
221f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22200 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
22210 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  ans(pBt, 0);.   
22220 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22250 50 61 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74  PagerSnapshotGet
22260 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
22270 65 72 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73  er(pBt), ppSnaps
22280 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hot);.        }.
22290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
222a0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
222b0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
222c0 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a  ex);.#endif   /*
222d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
222e0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
222f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
22300 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22310 6e 20 6f 6e 20 74 68 65 20 73 6e 61 70 73 68 6f  n on the snapsho
22320 74 20 69 64 65 6e 64 69 66 69 65 64 20 62 79 20  t idendified by 
22330 70 53 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e  pSnapshot..*/.in
22340 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  t sqlite3_snapsh
22350 6f 74 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74  ot_open(.  sqlit
22360 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
22370 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73   char *zDb, .  s
22380 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
22390 2a 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20  *pSnapshot.){.  
223a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
223b0 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53  ERROR;.#ifndef S
223c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
223d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
223e0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
223f0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
22400 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
22410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
22420 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
22430 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
22440 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22450 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
22460 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
22470 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  it==0 ){.    int
22480 20 69 44 62 3b 0a 20 20 20 20 69 44 62 20 3d 20   iDb;.    iDb = 
22490 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
224a0 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  e(db, zDb);.    
224b0 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44  if( iDb==0 || iD
224c0 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72  b>1 ){.      Btr
224d0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
224e0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
224f0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
22500 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61  BtreeIsInReadTra
22510 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
22520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22530 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e  agerSnapshotOpen
22540 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
22550 65 72 28 70 42 74 29 2c 20 70 53 6e 61 70 73 68  er(pBt), pSnapsh
22560 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ot);.        if(
22570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22580 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22590 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
225a0 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b  inTrans(pBt, 0);
225b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
225c0 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
225d0 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65  pen(sqlite3Btree
225e0 50 61 67 65 72 28 70 42 74 29 2c 20 30 29 3b 0a  Pager(pBt), 0);.
225f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22600 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
22610 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
22620 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
22630 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
22640 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
22650 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22660 0a 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20 6d  .** Recover as m
22670 61 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61 73  any snapshots as
22680 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
22690 68 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73 6f  he wal file asso
226a0 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 73  ciated with.** s
226b0 63 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61 74  chema zDb of dat
226c0 61 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  abase db..*/.int
226d0 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
226e0 74 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74 65  t_recover(sqlite
226f0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
22700 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72  r *zDb){.  int r
22710 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
22720 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69 66  ;.  int iDb;.#if
22730 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22740 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c  _WAL..#ifdef SQL
22750 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
22760 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
22770 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
22780 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
22790 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
227a0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
227b0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f..  sqlite3_mut
227c0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
227d0 65 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ex);.  iDb = sql
227e0 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
227f0 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69  b, zDb);.  if( i
22800 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29  Db==0 || iDb>1 )
22810 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
22820 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
22830 70 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  pBt;.    if( 0==
22840 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
22850 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29  ReadTrans(pBt) )
22860 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22870 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
22880 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  ans(pBt, 0);.   
22890 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
228a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
228b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
228c0 72 53 6e 61 70 73 68 6f 74 52 65 63 6f 76 65 72  rSnapshotRecover
228d0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
228e0 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
228f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
22900 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
22910 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
22920 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
22930 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
22940 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
22950 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
22960 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22970 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e 61 70 73  .** Free a snaps
22980 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74 61 69  hot handle obtai
22990 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
229a0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 29 2e  _snapshot_get().
229b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
229c0 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 73  _snapshot_free(s
229d0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
229e0 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73  *pSnapshot){.  s
229f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6e 61  qlite3_free(pSna
22a00 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pshot);.}.#endif
22a10 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
22a20 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23  E_SNAPSHOT */..#
22a30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22a40 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
22a50 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69 76  _DIAGS./*.** Giv
22a60 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
22a70 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
22a80 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 74 72 75  tion, return tru
22a90 65 20 69 66 20 74 68 61 74 20 6f 70 74 69 6f 6e  e if that option
22aa0 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 61 6e 64  .** was used and
22ab0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
22ac0 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20 63 61  *.** The name ca
22ad0 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67  n optionally beg
22ae0 69 6e 20 77 69 74 68 20 22 53 51 4c 49 54 45 5f  in with "SQLITE_
22af0 22 20 62 75 74 20 74 68 65 20 22 53 51 4c 49 54  " but the "SQLIT
22b00 45 5f 22 20 70 72 65 66 69 78 0a 2a 2a 20 69 73  E_" prefix.** is
22b10 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f   not required fo
22b20 72 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e  r a match..*/.in
22b30 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c  t sqlite3_compil
22b40 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e  eoption_used(con
22b50 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d  st char *zOptNam
22b60 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  e){.  int i, n;.
22b70 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f    int nOpt;.  co
22b80 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d  nst char **azCom
22b90 70 69 6c 65 4f 70 74 3b 0a 20 0a 23 69 66 20 53  pileOpt;. .#if S
22ba0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
22bb0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 7a 4f 70  _ARMOR.  if( zOp
22bc0 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tName==0 ){.    
22bd0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
22be0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
22bf0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
22c00 69 66 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f  if..  azCompileO
22c10 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  pt = sqlite3Comp
22c20 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74  ileOptions(&nOpt
22c30 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
22c40 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61  3StrNICmp(zOptNa
22c50 6d 65 2c 20 22 53 51 4c 49 54 45 5f 22 2c 20 37  me, "SQLITE_", 7
22c60 29 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d 65 20  )==0 ) zOptName 
22c70 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  += 7;.  n = sqli
22c80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
22c90 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e  Name);..  /* Sin
22ca0 63 65 20 6e 4f 70 74 20 69 73 20 6e 6f 72 6d 61  ce nOpt is norma
22cb0 6c 6c 79 20 69 6e 20 73 69 6e 67 6c 65 20 64 69  lly in single di
22cc0 67 69 74 73 2c 20 61 20 6c 69 6e 65 61 72 20 73  gits, a linear s
22cd0 65 61 72 63 68 20 69 73 20 0a 20 20 2a 2a 20 61  earch is .  ** a
22ce0 64 65 71 75 61 74 65 2e 20 4e 6f 20 6e 65 65 64  dequate. No need
22cf0 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 73 65   for a binary se
22d00 61 72 63 68 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  arch. */.  for(i
22d10 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b 29  =0; i<nOpt; i++)
22d20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
22d30 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61  3StrNICmp(zOptNa
22d40 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  me, azCompileOpt
22d50 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  [i], n)==0.     
22d60 26 26 20 73 71 6c 69 74 65 33 49 73 49 64 43 68  && sqlite3IsIdCh
22d70 61 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ar((unsigned cha
22d80 72 29 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69  r)azCompileOpt[i
22d90 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  ][n])==0.    ){.
22da0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
22db0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22dc0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
22dd0 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 63  eturn the N-th c
22de0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
22df0 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49 66 20 4e  on string.  If N
22e00 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
22e10 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 4e 55  ,.** return a NU
22e20 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63  LL pointer..*/.c
22e30 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
22e40 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  e3_compileoption
22e50 5f 67 65 74 28 69 6e 74 20 4e 29 7b 0a 20 20 69  _get(int N){.  i
22e60 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74  nt nOpt;.  const
22e70 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c   char **azCompil
22e80 65 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d 70 69 6c  eOpt;.  azCompil
22e90 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  eOpt = sqlite3Co
22ea0 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f  mpileOptions(&nO
22eb0 70 74 29 3b 0a 20 20 69 66 28 20 4e 3e 3d 30 20  pt);.  if( N>=0 
22ec0 26 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20 20  && N<nOpt ){.   
22ed0 20 72 65 74 75 72 6e 20 61 7a 43 6f 6d 70 69 6c   return azCompil
22ee0 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72  eOpt[N];.  }.  r
22ef0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
22f00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
22f10 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
22f20 49 41 47 53 20 2a 2f 0a                          IAGS */.