/ Hex Artifact Content
Login

Artifact d6b6e142b6c18f41ce5090faca2a9a3befcad21c5d9ea629f3d39d818166b9f4:


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 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
7290: 42 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56  BCONFIG_DEFENSIV
72a0: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53  E,             S
72b0: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20  QLITE_Defensive 
72c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b       },.      };
72d0: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
72e0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20  int i;.      rc 
72f0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
7300: 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d  /* IMP: R-42790-
7310: 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66  23372 */.      f
7320: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
7330: 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b  ize(aFlagOp); i+
7340: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
7350: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f  aFlagOp[i].op==o
7360: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
7370: 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72  nt onoff = va_ar
7380: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
7390: 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20        int *pRes 
73a0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
73b0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 33  *);.          u3
73c0: 32 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d  2 oldFlags = db-
73d0: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
73e0: 20 20 69 66 28 20 6f 6e 6f 66 66 3e 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 7c 3d 20 61 46 6c 61 67 4f  >flags |= aFlagO
7410: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
7420: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
7430: 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  noff==0 ){.     
7440: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
7450: 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e   &= ~aFlagOp[i].
7460: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
7470: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
7480: 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c  oldFlags!=db->fl
7490: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ags ){.         
74a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
74b0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
74c0: 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ts(db, 0);.     
74d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
74e0: 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20   if( pRes ){.   
74f0: 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
7500: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46   (db->flags & aF
7510: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d  lagOp[i].mask)!=
7520: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
7530: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
7540: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
7550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7560: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7570: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7580: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
7590: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
75a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
75b0: 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65  rue if the buffe
75c0: 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74  r z[0..n-1] cont
75d0: 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e  ains all spaces.
75e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
75f0: 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63  llSpaces(const c
7600: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
7610: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
7620: 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e  z[n-1]==' ' ){ n
7630: 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  --; }.  return n
7640: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
7650: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
7660: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
7670: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
7680: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
7690: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
76a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
76b0: 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  adFlag argument 
76c0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
76d0: 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61   space padding a
76e0: 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  t the end.** of 
76f0: 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72  strings is ignor
7700: 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ed.  This implem
7710: 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63  ents the RTRIM c
7720: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ollation..*/.sta
7730: 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46  tic int binCollF
7740: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64  unc(.  void *pad
7750: 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Flag,.  int nKey
7760: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7770: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
7780: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
7790: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
77a0: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
77b0: 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
77c0: 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49   nKey2;.  /* EVI
77d0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33  DENCE-OF: R-6503
77e0: 33 2d 32 38 34 34 39 20 54 68 65 20 62 75 69 6c  3-28449 The buil
77f0: 74 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c  t-in BINARY coll
7800: 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20  ation compares. 
7810: 20 2a 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65   ** strings byte
7820: 20 62 79 20 62 79 74 65 20 75 73 69 6e 67 20 74   by byte using t
7830: 68 65 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63  he memcmp() func
7840: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74  tion from the st
7850: 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69  andard C.  ** li
7860: 62 72 61 72 79 2e 20 2a 2f 0a 20 20 61 73 73 65  brary. */.  asse
7870: 72 74 28 20 70 4b 65 79 31 20 26 26 20 70 4b 65  rt( pKey1 && pKe
7880: 79 32 20 29 3b 0a 20 20 72 63 20 3d 20 6d 65 6d  y2 );.  rc = mem
7890: 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
78a0: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
78b0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64  0 ){.    if( pad
78c0: 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c  Flag.     && all
78d0: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
78e0: 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e  Key1)+n, nKey1-n
78f0: 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  ).     && allSpa
7900: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
7910: 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20  2)+n, nKey2-n). 
7920: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45     ){.      /* E
7930: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
7940: 36 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20  624-24737 RTRIM 
7950: 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65  is like BINARY e
7960: 78 63 65 70 74 20 74 68 61 74 20 65 78 74 72 61  xcept that extra
7970: 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73  .      ** spaces
7980: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
7990: 69 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20  ither string do 
79a0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 72  not change the r
79b0: 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a  esult. In other.
79c0: 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20        ** words, 
79d0: 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d  strings will com
79e0: 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e  pare equal to on
79f0: 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e  e another as lon
7a00: 67 20 61 73 20 74 68 65 79 0a 20 20 20 20 20 20  g as they.      
7a10: 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69  ** differ only i
7a20: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7a30: 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e  spaces at the en
7a40: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
7a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7a60: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
7a70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7a80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7a90: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
7aa0: 43 6f 6c 6c 53 65 71 20 69 73 20 74 68 65 20 64  CollSeq is the d
7ab0: 65 66 61 75 6c 74 20 62 75 69 6c 74 2d 69 6e 20  efault built-in 
7ac0: 42 49 4e 41 52 59 2e 0a 2a 2f 0a 69 6e 74 20 73  BINARY..*/.int s
7ad0: 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 63  qlite3IsBinary(c
7ae0: 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 29  onst CollSeq *p)
7af0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
7b00: 20 7c 7c 20 70 2d 3e 78 43 6d 70 21 3d 62 69 6e   || p->xCmp!=bin
7b10: 43 6f 6c 6c 46 75 6e 63 20 7c 7c 20 70 2d 3e 70  CollFunc || p->p
7b20: 55 73 65 72 21 3d 30 0a 20 20 20 20 20 20 20 20  User!=0.        
7b30: 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 2d      || strcmp(p-
7b40: 3e 7a 4e 61 6d 65 2c 22 42 49 4e 41 52 59 22 29  >zName,"BINARY")
7b50: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
7b60: 70 3d 3d 30 20 7c 7c 20 28 70 2d 3e 78 43 6d 70  p==0 || (p->xCmp
7b70: 3d 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 26 26  ==binCollFunc &&
7b80: 20 70 2d 3e 70 55 73 65 72 3d 3d 30 29 3b 0a 7d   p->pUser==0);.}
7b90: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
7ba0: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
7bb0: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
7bc0: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
7bd0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7be0: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
7bf0: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
7c00: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74  case independent
7c10: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
7c20: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
7c30: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
7c40: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
7c50: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
7c60: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
7c70: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
7c80: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
7c90: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
7ca0: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
7cb0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
7cc0: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
7cd0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
7ce0: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
7cf0: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
7d00: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
7d10: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
7d20: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
7d30: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
7d40: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
7d50: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
7d60: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
7d70: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
7d80: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7d90: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
7da0: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
7db0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
7dc0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
7dd0: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
7de0: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
7df0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7e10: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
7e20: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
7e30: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
7e40: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
7e50: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
7e60: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7e70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7e80: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7e90: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7ea0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7eb0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7ec0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7ed0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7ee0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7ef0: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
7f00: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7f10: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
7f20: 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61  y the sqlite3_la
7f30: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
7f40: 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  ) API function..
7f50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
7f60: 73 65 74 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  set_last_insert_
7f70: 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  rowid(sqlite3 *d
7f80: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  b, sqlite3_int64
7f90: 20 69 52 6f 77 69 64 29 7b 0a 23 69 66 64 65 66   iRowid){.#ifdef
7fa0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
7fb0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
7fc0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
7fd0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
7fe0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
7ff0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
8000: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
8010: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8020: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8030: 29 3b 0a 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77  );.  db->lastRow
8040: 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 73  id = iRowid;.  s
8050: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8060: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ve(db->mutex);.}
8070: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8080: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
8090: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
80a0: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
80b0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
80c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
80d0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
80e0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
80f0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
8100: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
8110: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
8120: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
8130: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
8140: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
8150: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
8160: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
8170: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
8180: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8190: 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20  f changes since 
81a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
81b0: 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  dle was opened..
81c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
81d0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c  otal_changes(sql
81e0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
81f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8200: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
8210: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
8220: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
8230: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
8240: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
8250: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
8260: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
8270: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d  >nTotalChange;.}
8280: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
8290: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
82a0: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
82b0: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
82c0: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  s fields of the.
82d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
82e0: 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f  le object, it do
82f0: 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79  es not close any
8300: 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
8310: 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20   may be open.** 
8320: 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61  at the b-tree/pa
8330: 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  ger level..*/.vo
8340: 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  id sqlite3CloseS
8350: 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65  avepoints(sqlite
8360: 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28  3 *db){.  while(
8370: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
8380: 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74  ){.    Savepoint
8390: 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61   *pTmp = db->pSa
83a0: 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d  vepoint;.    db-
83b0: 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
83c0: 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  mp->pNext;.    s
83d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
83e0: 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62   pTmp);.  }.  db
83f0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
8400: 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  ;.  db->nStateme
8410: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73  nt = 0;.  db->is
8420: 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
8430: 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint = 0;.}../*.
8440: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65  ** Invoke the de
8450: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
8460: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
8470: 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20  h FuncDef p, if 
8480: 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20  any. Except,.** 
8490: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  if this is not t
84a0: 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20  he last copy of 
84b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f  the function, do
84c0: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20   not invoke it. 
84d0: 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69  Multiple.** copi
84e0: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66  es of a single f
84f0: 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61  unction are crea
8500: 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f  ted when create_
8510: 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61  function() is ca
8520: 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c  lled.** with SQL
8530: 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65  ITE_ANY as the e
8540: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
8550: 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e  ic void function
8560: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
8570: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29  *db, FuncDef *p)
8580: 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  {.  FuncDestruct
8590: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20  or *pDestructor 
85a0: 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72 75 63 74  = p->u.pDestruct
85b0: 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72  or;.  if( pDestr
85c0: 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65  uctor ){.    pDe
85d0: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d  structor->nRef--
85e0: 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 72  ;.    if( pDestr
85f0: 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  uctor->nRef==0 )
8600: 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75 63  {.      pDestruc
8610: 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44  tor->xDestroy(pD
8620: 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72  estructor->pUser
8630: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  Data);.      sql
8640: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8650: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
8660: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8670: 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73  Disconnect all s
8680: 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65  qlite3_vtab obje
8690: 63 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  cts that belong 
86a0: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  to database conn
86b0: 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68  ection.** db. Th
86c0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  is is called whe
86d0: 6e 20 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c  n db is being cl
86e0: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
86f0: 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41  void disconnectA
8700: 6c 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a  llVtab(sqlite3 *
8710: 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  db){.#ifndef SQL
8720: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8730: 54 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20  TABLE.  int i;. 
8740: 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20   HashElem *p;.  
8750: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
8760: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
8770: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
8780: 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61  i++){.    Schema
8790: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
87a0: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[i].pSchema;.
87b0: 20 20 20 20 69 66 28 20 70 53 63 68 65 6d 61 20      if( pSchema 
87c0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73  ){.      for(p=s
87d0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
87e0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
87f0: 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61  ); p; p=sqliteHa
8800: 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20  shNext(p)){.    
8810: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8820: 3d 20 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74  = (Table *)sqlit
8830: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
8840: 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
8850: 75 61 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69  ual(pTab) ) sqli
8860: 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  te3VtabDisconnec
8870: 74 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  t(db, pTab);.   
8880: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8890: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
88a0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
88b0: 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ule); p; p=sqlit
88c0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
88d0: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
88e0: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
88f0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
8900: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70     if( pMod->pEp
8910: 6f 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71  oTab ){.      sq
8920: 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e  lite3VtabDisconn
8930: 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45  ect(db, pMod->pE
8940: 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  poTab);.    }.  
8950: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  }.  sqlite3VtabU
8960: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
8970: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
8980: 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65  veAll(db);.#else
8990: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
89a0: 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a  TER(db);.#endif.
89b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
89c0: 54 52 55 45 20 69 66 20 64 61 74 61 62 61 73 65  TRUE if database
89d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
89e0: 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  as unfinalized p
89f0: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
8a00: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
8a10: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
8a20: 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f  up objects.  .*/
8a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e  .static int conn
8a40: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c  ectionIsBusy(sql
8a50: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
8a60: 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   j;.  assert( sq
8a70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8a80: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
8a90: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
8aa0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
8ab0: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
8ac0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   j++){.    Btree
8ad0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8ae0: 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  j].pBt;.    if( 
8af0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
8b00: 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42  reeIsInBackup(pB
8b10: 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  t) ) return 1;. 
8b20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8b30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
8b40: 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65   existing SQLite
8b50: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61   database.*/.sta
8b60: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43  tic int sqlite3C
8b70: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
8b80: 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69  , int forceZombi
8b90: 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  e){.  if( !db ){
8ba0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
8bb0: 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37  -OF: R-63257-117
8bc0: 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74  40 Calling sqlit
8bd0: 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20  e3_close() or.  
8be0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f    ** sqlite3_clo
8bf0: 73 65 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e  se_v2() with a N
8c00: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75  ULL pointer argu
8c10: 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65  ment is a harmle
8c20: 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20  ss no-op. */.   
8c30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8c40: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  K;.  }.  if( !sq
8c50: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
8c60: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
8c70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c80: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
8c90: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
8ca0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
8cb0: 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
8cc0: 54 72 61 63 65 20 26 20 53 51 4c 49 54 45 5f 54  Trace & SQLITE_T
8cd0: 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20  RACE_CLOSE ){.  
8ce0: 20 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c    db->xTrace(SQL
8cf0: 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 2c  ITE_TRACE_CLOSE,
8d00: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20   db->pTraceArg, 
8d10: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  db, 0);.  }..  /
8d20: 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e  * Force xDisconn
8d30: 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c  ect calls on all
8d40: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
8d50: 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63 74 41  */.  disconnectA
8d60: 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f  llVtab(db);..  /
8d70: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
8d80: 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20  on is open, the 
8d90: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
8da0: 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20  b() call above. 
8db0: 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76   ** will not hav
8dc0: 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69  e called the xDi
8dd0: 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  sconnect() metho
8de0: 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c  d on any virtual
8df0: 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20  .  ** tables in 
8e00: 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b  the db->aVTrans[
8e10: 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c  ] array. The fol
8e20: 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74  lowing sqlite3Vt
8e30: 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a  abRollback().  *
8e40: 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73  * call will do s
8e50: 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f  o. We need to do
8e60: 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65   this before the
8e70: 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76   check for activ
8e80: 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
8e90: 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20  ments below, as 
8ea0: 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c  the v-table impl
8eb0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62  ementation may b
8ec0: 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73  e storing.  ** s
8ed0: 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ome prepared sta
8ee0: 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c  tements internal
8ef0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ly..  */.  sqlit
8f00: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64  e3VtabRollback(d
8f10: 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79  b);..  /* Legacy
8f20: 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c 69 74   behavior (sqlit
8f30: 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68 61 76  e3_close() behav
8f40: 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74 75 72  ior) is to retur
8f50: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55  n.  ** SQLITE_BU
8f60: 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  SY if the connec
8f70: 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20  tion can not be 
8f80: 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65  closed immediate
8f90: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ly..  */.  if( !
8fa0: 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26 20 63  forceZombie && c
8fb0: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
8fc0: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
8fd0: 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
8fe0: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
8ff0: 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65  "unable to close
9000: 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69   due to unfinali
9010: 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22 73 74  zed ".       "st
9020: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
9030: 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73 22 29  nished backups")
9040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
9050: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9060: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
9070: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
9080: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
9090: 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
90a0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
90b0: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
90c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69   ){.    /* Closi
90d0: 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 46  ng the handle. F
90e0: 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20  ourth parameter 
90f0: 69 73 20 70 61 73 73 65 64 20 74 68 65 20 76 61  is passed the va
9100: 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71  lue 2. */.    sq
9110: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
9120: 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65  g.xSqllog(sqlite
9130: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
9140: 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c  qllogArg, db, 0,
9150: 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   2);.  }.#endif.
9160: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
9170: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74  e connection int
9180: 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74  o a zombie and t
9190: 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20  hen close it..  
91a0: 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  */.  db->magic =
91b0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f   SQLITE_MAGIC_ZO
91c0: 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c  MBIE;.  sqlite3L
91d0: 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73  eaveMutexAndClos
91e0: 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72  eZombie(db);.  r
91f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61  .}../*.** Two va
9210: 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  riations on the 
9220: 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65  public interface
9230: 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64   for closing a d
9240: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
9250: 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74  ction. The sqlit
9260: 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69  e3_close() versi
9270: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
9280: 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65  E_BUSY and.** le
9290: 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  aves the connect
92a0: 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68  ion option if th
92b0: 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69  ere are unfinali
92c0: 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  zed prepared.** 
92d0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
92e0: 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33  finished sqlite3
92f0: 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73  _backups.  The s
9300: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
9310: 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72  ).** version for
9320: 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ces the connecti
9330: 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a  on to become a z
9340: 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65 20 61  ombie if there a
9350: 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72  re.** unclosed r
9360: 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72  esources, and ar
9370: 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c  ranges for deall
9380: 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  ocation when the
9390: 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65   last.** prepare
93a0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71   statement or sq
93b0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f  lite3_backup clo
93c0: 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ses..*/.int sqli
93d0: 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65  te3_close(sqlite
93e0: 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73  3 *db){ return s
93f0: 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30  qlite3Close(db,0
9400: 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  ); }.int sqlite3
9410: 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65  _close_v2(sqlite
9420: 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73  3 *db){ return s
9430: 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31  qlite3Close(db,1
9440: 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ); }.../*.** Clo
9450: 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  se the mutex on 
9460: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9470: 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75  ion db..**.** Fu
9480: 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61  rthermore, if da
9490: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
94a0: 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65  n db is a zombie
94b0: 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74   (meaning that t
94c0: 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  here.** has been
94d0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
94e0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
94f0: 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c  b) or sqlite3_cl
9500: 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a  ose_v2(db)) and.
9510: 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65 33  ** every sqlite3
9520: 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65  _stmt has now be
9530: 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
9540: 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62   every sqlite3_b
9550: 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e  ackup has.** fin
9560: 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65  ished, then free
9570: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a   all resources..
9580: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c  */.void sqlite3L
9590: 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73  eaveMutexAndClos
95a0: 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20  eZombie(sqlite3 
95b0: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
95c0: 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   *i;            
95d0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
95e0: 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a  table iterator *
95f0: 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  /.  int j;..  /*
9600: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
9610: 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65  tstanding sqlite
9620: 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65  3_stmt or sqlite
9630: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
9640: 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20  .  ** or if the 
9650: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e  connection has n
9660: 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73  ot yet been clos
9670: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c  ed by sqlite3_cl
9680: 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74  ose_v2(),.  ** t
9690: 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74  hen just leave t
96a0: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74  he mutex and ret
96b0: 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
96c0: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
96d0: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c  E_MAGIC_ZOMBIE |
96e0: 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  | connectionIsBu
96f0: 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71  sy(db) ){.    sq
9700: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9710: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9720: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
9730: 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
9740: 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
9750: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61  eans that the da
9760: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9770: 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65  n has.  ** close
9780: 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74  d all sqlite3_st
9790: 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62  mt and sqlite3_b
97a0: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e  ackup objects an
97b0: 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  d has been.  ** 
97c0: 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
97d0: 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67  3_close (meaning
97e0: 20 74 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f   that it is a zo
97f0: 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72  mbie).  Therefor
9800: 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64  e,.  ** go ahead
9810: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65   and free all re
9820: 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20  sources..  */.. 
9830: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
9840: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f  tion is open, ro
9850: 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68 69 73  ll it back. This
9860: 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20 74 68   also ensures th
9870: 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64  at if.  ** any d
9880: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 73 20  atabase schemas 
9890: 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69  have been modifi
98a0: 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69  ed by an uncommi
98b0: 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
98c0: 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 72  .  ** they are r
98d0: 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74 20 74  eset. And that t
98e0: 68 65 20 72 65 71 75 69 72 65 64 20 62 2d 74 72  he required b-tr
98f0: 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
9900: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68   to make.  ** th
9910: 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b  e pager rollback
9920: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
9930: 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72  t an atomic oper
9940: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69  ation. */.  sqli
9950: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
9960: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a  b, SQLITE_OK);..
9970: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75    /* Free any ou
9980: 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f  tstanding Savepo
9990: 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20  int structures. 
99a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  */.  sqlite3Clos
99b0: 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
99c0: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
99d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
99e0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a  tions */.  for(j
99f0: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
9a00: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
9a10: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
9a20: 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[j];.    if( p
9a30: 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Db->pBt ){.     
9a40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
9a50: 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  se(pDb->pBt);.  
9a60: 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30      pDb->pBt = 0
9a70: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31  ;.      if( j!=1
9a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
9a90: 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  >pSchema = 0;.  
9aa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9ab0: 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54    /* Clear the T
9ac0: 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61 72  EMP schema separ
9ad0: 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a  ately and last *
9ae0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /.  if( db->aDb[
9af0: 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
9b00: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
9b10: 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  lear(db->aDb[1].
9b20: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
9b30: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
9b40: 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  kList(db);..  /*
9b50: 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72 72   Free up the arr
9b60: 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  ay of auxiliary 
9b70: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73  databases */.  s
9b80: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
9b90: 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b  tabaseArray(db);
9ba0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
9bb0: 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  Db<=2 );.  asser
9bc0: 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e  t( db->aDb==db->
9bd0: 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20  aDbStatic );..  
9be0: 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65  /* Tell the code
9bf0: 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61   in notify.c tha
9c00: 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
9c10: 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73   no longer holds
9c20: 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20   any.  ** locks 
9c30: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  and does not req
9c40: 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72  uire any further
9c50: 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
9c60: 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
9c70: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
9c80: 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20  onClosed(db);.. 
9c90: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9ca0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e  hFirst(&db->aFun
9cb0: 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  c); i; i=sqliteH
9cc0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
9cd0: 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c   FuncDef *pNext,
9ce0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
9cf0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9d00: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66 75      do{.      fu
9d10: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
9d20: 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  , p);.      pNex
9d30: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
9d40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9d50: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
9d60: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  p = pNext;.    }
9d70: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a  while( p );.  }.
9d80: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
9d90: 61 72 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a  ar(&db->aFunc);.
9da0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
9db0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
9dc0: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
9dd0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
9de0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
9df0: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
9e00: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9e10: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
9e20: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
9e30: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
9e40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9e50: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
9e60: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
9e70: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
9e80: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
9e90: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
9ea0: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
9eb0: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
9ec0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
9ed0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9ee0: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
9ef0: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
9f00: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
9f10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9f20: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
9f30: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
9f40: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
9f50: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
9f60: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9f70: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
9f80: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
9f90: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9fa0: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
9fb0: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
9fc0: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
9fd0: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
9fe0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  }.    sqlite3Vta
9ff0: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43  bEponymousTableC
a000: 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a  lear(db, pMod);.
a010: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a020: 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d  e(db, pMod);.  }
a030: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
a040: 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ear(&db->aModule
a050: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  );.#endif..  sql
a060: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
a070: 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61  LITE_OK); /* Dea
a080: 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63  llocates any cac
a090: 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67  hed error string
a0a0: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  s. */.  sqlite3V
a0b0: 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72  alueFree(db->pEr
a0c0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f  r);.  sqlite3Clo
a0d0: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
a0e0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
a0f0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
a100: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a110: 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73  db->auth.zAuthUs
a120: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er);.  sqlite3_f
a130: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
a140: 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  thPW);.#endif.. 
a150: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
a160: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
a170: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
a180: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
a190: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
a1a0: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
a1b0: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
a1c0: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
a1d0: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
a1e0: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
a1f0: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
a200: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
a210: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
a220: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
a230: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
a240: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
a250: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
a260: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
a270: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
a280: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
a290: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
a2a0: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
a2b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
a2c0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31  ee(db, db->aDb[1
a2d0: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ].pSchema);.  sq
a2e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a2f0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a300: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
a310: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
a320: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a330: 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29  _free(db->mutex)
a340: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a350: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
a360: 28 64 62 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 69  (db,0)==0 );.  i
a370: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
a380: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
a390: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
a3a0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
a3b0: 61 72 74 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  art);.  }.#ifdef
a3c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
a3d0: 51 4c 52 52 0a 20 20 53 52 52 65 63 43 6c 6f 73  QLRR.  SRRecClos
a3e0: 65 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e(db);.#endif.  
a3f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a400: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  db);.}../*.** Ro
a410: 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62  llback all datab
a420: 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74  ase files.  If t
a430: 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53  ripCode is not S
a440: 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a  QLITE_OK, then.*
a450: 2a 20 61 6e 79 20 77 72 69 74 65 20 63 75 72 73  * any write curs
a460: 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
a470: 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d  ted ("tripped" -
a480: 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67   as in "tripping
a490: 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72   a circuit.** br
a4a0: 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65  eaker") and made
a4b0: 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43   to return tripC
a4c0: 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65  ode if there are
a4d0: 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20   any further.** 
a4e0: 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20  attempts to use 
a4f0: 74 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65  that cursor.  Re
a500: 61 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69  ad cursors remai
a510: 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64  n open and valid
a520: 0a 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61 76  .** but are "sav
a530: 65 64 22 20 69 6e 20 63 61 73 65 20 74 68 65 20  ed" in case the 
a540: 74 61 62 6c 65 20 70 61 67 65 73 20 61 72 65 20  table pages are 
a550: 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f  moved around..*/
a560: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
a570: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
a580: 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f   *db, int tripCo
a590: 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  de){.  int i;.  
a5a0: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
a5b0: 0a 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61  .  int schemaCha
a5c0: 6e 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  nge;.  assert( s
a5d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a5e0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
a5f0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
a600: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
a610: 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62   /* Obtain all b
a620: 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65  -tree mutexes be
a630: 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20  fore making any 
a640: 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f  calls to BtreeRo
a650: 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20  llback(). .  ** 
a660: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
a670: 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72  t in case the tr
a680: 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20  ansaction being 
a690: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a  rolled back has.
a6a0: 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68    ** modified th
a6b0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
a6c0: 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  a. If the b-tree
a6d0: 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74   mutexes are not
a6e0: 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65   taken.  ** here
a6f0: 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73  , then another s
a700: 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e  hared-cache conn
a710: 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65  ection might sne
a720: 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20  ak in between.  
a730: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
a740: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
a750: 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68  ema reset, which
a760: 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65   can cause false
a770: 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  .  ** corruption
a780: 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65   reports in some
a790: 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71   cases.  */.  sq
a7a0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
a7b0: 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61  ll(db);.  schema
a7c0: 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44  Change = (db->mD
a7d0: 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f  bFlags & DBFLAG_
a7e0: 53 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30  SchemaChange)!=0
a7f0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
a800: 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  y==0;..  for(i=0
a810: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
a820: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
a830: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
a840: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
a850: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a860: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
a870: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54  ) ){.        inT
a880: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  rans = 1;.      
a890: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
a8a0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
a8b0: 74 72 69 70 43 6f 64 65 2c 20 21 73 63 68 65 6d  tripCode, !schem
a8c0: 61 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a  aChange);.    }.
a8d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
a8e0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20  bRollback(db);. 
a8f0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
a900: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66  nMalloc();..  if
a910: 28 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20 29  ( schemaChange )
a920: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
a930: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
a940: 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20  ments(db, 0);.  
a950: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
a960: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
a970: 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20  tion(db);.  }.  
a980: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
a990: 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
a9a0: 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e  Any deferred con
a9b0: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
a9c0: 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  ns have now been
a9d0: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
a9e0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
a9f0: 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65  s = 0;.  db->nDe
aa00: 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
aa10: 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  0;.  db->flags &
aa20: 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46  = ~SQLITE_DeferF
aa30: 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  Ks;..  /* If one
aa40: 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67   has been config
aa50: 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65  ured, invoke the
aa60: 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63   rollback-hook c
aa70: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  allback */.  if(
aa80: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
aa90: 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61  llback && (inTra
aaa0: 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43  ns || !db->autoC
aab0: 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62  ommit) ){.    db
aac0: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
aad0: 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ack(db->pRollbac
aae0: 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  kArg);.  }.}../*
aaf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61  .** Return a sta
ab00: 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  tic string conta
ab10: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63  ining the name c
ab20: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
ab30: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
ab40: 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  * specified in t
ab50: 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
ab60: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
ab70: 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45  TE_NEED_ERR_NAME
ab80: 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  ).const char *sq
ab90: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74  lite3ErrName(int
aba0: 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   rc){.  const ch
abb0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
abc0: 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d   int i, origRc =
abd0: 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   rc;.  for(i=0; 
abe0: 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b  i<2 && zName==0;
abf0: 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66   i++, rc &= 0xff
ac00: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72  ){.    switch( r
ac10: 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  c ){.      case 
ac20: 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20  SQLITE_OK:      
ac30: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ac40: 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20   = "SQLITE_OK"; 
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
ac60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ac70: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20   SQLITE_ERROR:  
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
ac90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  e = "SQLITE_ERRO
aca0: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
acb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
acc0: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 53  e SQLITE_ERROR_S
acd0: 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 7a 4e 61  NAPSHOT:     zNa
ace0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52  me = "SQLITE_ERR
acf0: 4f 52 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20  OR_SNAPSHOT";   
ad00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ad10: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  se SQLITE_INTERN
ad20: 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  AL:           zN
ad30: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
ad40: 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20  TERNAL";        
ad50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ad60: 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a  ase SQLITE_PERM:
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
ad80: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
ad90: 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERM";           
ada0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
adb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
adc0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T:              
add0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ade0: 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20  ABORT";         
adf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ae00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
ae10: 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20  RT_ROLLBACK:    
ae20: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ae30: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22  _ABORT_ROLLBACK"
ae40: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
ae50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
ae60: 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SY:             
ae70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ae80: 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20  E_BUSY";        
ae90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aea0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
aeb0: 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20  USY_RECOVERY:   
aec0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
aed0: 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59  TE_BUSY_RECOVERY
aee0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
aef0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af00: 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20  BUSY_SNAPSHOT:  
af10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
af20: 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
af30: 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
af40: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
af50: 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20  _LOCKED:        
af60: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
af70: 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20  LITE_LOCKED";   
af80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
af90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
afa0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
afb0: 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  ACHE: zName = "S
afc0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
afd0: 52 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b  REDCACHE";break;
afe0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aff0: 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20  TE_NOMEM:       
b000: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b010: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20  SQLITE_NOMEM";  
b020: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b030: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b040: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20  ITE_READONLY:   
b050: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b060: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
b070: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
b080: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b090: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45  LITE_READONLY_RE
b0a0: 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d  COVERY:  zName =
b0b0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
b0c0: 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65  Y_RECOVERY"; bre
b0d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b0e0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
b0f0: 41 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65 20  ANTINIT:  zName 
b100: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
b110: 4c 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62 72  LY_CANTINIT"; br
b120: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b130: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b140: 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65  ROLLBACK:  zName
b150: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
b160: 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  NLY_ROLLBACK"; b
b170: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b180: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
b190: 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d  _DBMOVED:   zNam
b1a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b1b0: 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20  ONLY_DBMOVED";  
b1c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b1d0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
b1e0: 59 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e 61  Y_DIRECTORY: zNa
b1f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
b200: 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 22  DONLY_DIRECTORY"
b210: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b220: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  se SQLITE_INTERR
b230: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e  UPT:          zN
b240: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
b250: 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  TERRUPT";       
b260: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b270: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b280: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
b290: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b2a0: 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20  OERR";          
b2b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b2c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b2d0: 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20  R_READ:         
b2e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b2f0: 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20  IOERR_READ";    
b300: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b310: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b320: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20  RR_SHORT_READ:  
b330: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b340: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
b350: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
b360: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b370: 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20  ERR_WRITE:      
b380: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b390: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20  E_IOERR_WRITE"; 
b3a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b3c0: 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20  OERR_FSYNC:     
b3d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b3e0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b  TE_IOERR_FSYNC";
b3f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b400: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b410: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a  IOERR_DIR_FSYNC:
b420: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b430: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
b440: 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  YNC";   break;. 
b450: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b460: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a  _IOERR_TRUNCATE:
b470: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b480: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
b490: 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATE";    break;.
b4a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b4b0: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20  E_IOERR_FSTAT:  
b4c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b4d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
b4e0: 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  T";       break;
b4f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b500: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a  TE_IOERR_UNLOCK:
b510: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b520: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
b530: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
b540: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b550: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
b560: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b570: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44  "SQLITE_IOERR_RD
b580: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
b590: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b5a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
b5b0: 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  E:       zName =
b5c0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
b5d0: 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65  ELETE";      bre
b5e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b5f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
b600: 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  M:        zName 
b610: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b620: 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72  NOMEM";       br
b630: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b640: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
b650: 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ESS:       zName
b660: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b670: 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20 62  _ACCESS";      b
b680: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b690: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
b6a0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a  ECKRESERVEDLOCK:
b6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b6e0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
b6f0: 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  RVEDLOCK"; break
b700: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b710: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20  ITE_IOERR_LOCK: 
b720: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b730: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f  "SQLITE_IOERR_LO
b740: 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  CK";        brea
b750: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b760: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
b770: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
b780: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
b790: 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72 65  LOSE";       bre
b7a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b7b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
b7c0: 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20  CLOSE:    zName 
b7d0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b7e0: 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72  DIR_CLOSE";   br
b7f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b800: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b810: 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65  OPEN:      zName
b820: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b830: 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62  _SHMOPEN";     b
b840: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b850: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b860: 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d  MSIZE:      zNam
b870: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b880: 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20  R_SHMSIZE";     
b890: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b8a0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b8b0: 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61  HMLOCK:      zNa
b8c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b8d0: 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20  RR_SHMLOCK";    
b8e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b8f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b900: 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e  SHMMAP:       zN
b910: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b920: 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20  ERR_SHMMAP";    
b930: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b940: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b950: 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a  _SEEK:         z
b960: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b970: 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20  OERR_SEEK";     
b980: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b990: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b9a0: 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20  R_DELETE_NOENT: 
b9b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b9c0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
b9d0: 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  NT";break;.     
b9e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b9f0: 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20  RR_MMAP:        
ba00: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ba10: 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20  _IOERR_MMAP";   
ba20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ba30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ba40: 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a  ERR_GETTEMPPATH:
ba50: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ba60: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
ba70: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
ba80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ba90: 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OERR_CONVPATH:  
baa0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bab0: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
bac0: 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  H";    break;.  
bad0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bae0: 49 4f 45 52 52 5f 56 4e 4f 44 45 3a 20 20 20 20  IOERR_VNODE:    
baf0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bb00: 49 54 45 5f 49 4f 45 52 52 5f 56 4e 4f 44 45 22  ITE_IOERR_VNODE"
bb10: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
bb20: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bb30: 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20  _CORRUPT:       
bb40: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bb50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20  LITE_CORRUPT";  
bb60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bb70: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bb80: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20  E_CORRUPT_VTAB: 
bb90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bba0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
bbb0: 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AB";      break;
bbc0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bbd0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20  TE_NOTFOUND:    
bbe0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bbf0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22  SQLITE_NOTFOUND"
bc00: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
bc10: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bc20: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
bc30: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bc40: 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20  "SQLITE_FULL";  
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bc60: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bc70: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
bc80: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bc90: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
bca0: 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  N";          bre
bcb0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bcc0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
bcd0: 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20  OTEMPDIR: zName 
bce0: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
bcf0: 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72  EN_NOTEMPDIR";br
bd00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bd10: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bd20: 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65  ISDIR:     zName
bd30: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
bd40: 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62  PEN_ISDIR";    b
bd50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bd60: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bd70: 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d  _FULLPATH:  zNam
bd80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bd90: 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20  OPEN_FULLPATH"; 
bda0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bdb0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
bdc0: 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61  N_CONVPATH:  zNa
bdd0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
bde0: 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b  TOPEN_CONVPATH";
bdf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
be00: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
be10: 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  OL:           zN
be20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52  ame = "SQLITE_PR
be30: 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20  OTOCOL";        
be40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
be50: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
be60: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
be70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
be80: 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20  MPTY";          
be90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bea0: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
beb0: 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  MA:             
bec0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bed0: 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20  SCHEMA";        
bee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bef0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
bf00: 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  BIG:            
bf10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bf20: 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20  _TOOBIG";       
bf30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bf40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bf50: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
bf60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bf70: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20  E_CONSTRAINT";  
bf80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bfa0: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
bfb0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
bfc0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
bfd0: 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  IQUE"; break;.  
bfe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bff0: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
c000: 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  ER: zName = "SQL
c010: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
c020: 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20  RIGGER";break;. 
c030: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c040: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
c050: 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  IGNKEY:.        
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c080: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
c090: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20  NT_FOREIGNKEY"; 
c0a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c0b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c0c0: 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a  RAINT_CHECK:   z
c0d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c0e0: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22  ONSTRAINT_CHECK"
c0f0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
c100: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
c110: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
c120: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c150: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
c160: 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65  IMARYKEY";   bre
c170: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c180: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c190: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20  _NOTNULL: zName 
c1a0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c1b0: 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72  AINT_NOTNULL";br
c1c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c1d0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c1e0: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20  T_COMMITHOOK:.  
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c210: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c220: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
c230: 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OOK";   break;. 
c240: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c250: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
c260: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
c270: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c280: 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a  VTAB";   break;.
c290: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c2a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
c2b0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20  CTION:.         
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c2e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c2f0: 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20  T_FUNCTION";    
c300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c310: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c320: 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e  AINT_ROWID:   zN
c330: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c340: 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b  NSTRAINT_ROWID";
c350: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c360: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  ase SQLITE_MISMA
c370: 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a  TCH:           z
c380: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
c390: 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20  ISMATCH";       
c3a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c3b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55  case SQLITE_MISU
c3c0: 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SE:             
c3d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c3e0: 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20  MISUSE";        
c3f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c400: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c   case SQLITE_NOL
c410: 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  FS:             
c420: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c430: 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20  _NOLFS";        
c440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c450: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55    case SQLITE_AU
c460: 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TH:             
c470: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c480: 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20  E_AUTH";        
c490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c4a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
c4b0: 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20  ORMAT:          
c4c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c4d0: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
c4e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c4f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c500: 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20  RANGE:          
c510: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c520: 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20  ITE_RANGE";     
c530: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c540: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c550: 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20  _NOTADB:        
c560: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c570: 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20  LITE_NOTADB";   
c580: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c590: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c5a0: 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20  E_ROW:          
c5b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c5c0: 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20  QLITE_ROW";     
c5d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c5e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c5f0: 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20  TE_NOTICE:      
c600: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c610: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20  SQLITE_NOTICE"; 
c620: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c630: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c640: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
c650: 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20  ER_WAL: zName = 
c660: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
c670: 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61  ECOVER_WAL";brea
c680: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c690: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c6a0: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20  VER_ROLLBACK:.  
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c6d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c6e0: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
c6f0: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
c700: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c710: 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20  _WARNING:       
c720: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c730: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20  LITE_WARNING";  
c740: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c750: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c760: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
c770: 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  DEX:  zName = "S
c780: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
c790: 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  TOINDEX"; break;
c7a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c7b0: 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20  TE_DONE:        
c7c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c7d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20  SQLITE_DONE";   
c7e0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c7f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c800: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
c810: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42    static char zB
c820: 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69  uf[50];.    sqli
c830: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
c840: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
c850: 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e   "SQLITE_UNKNOWN
c860: 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a  (%d)", origRc);.
c870: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66      zName = zBuf
c880: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
c890: 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
c8a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
c8b0: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
c8c0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
c8d0: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
c8e0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
c8f0: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
c900: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
c910: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
c920: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
c930: 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73   char* const aMs
c940: 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53  g[] = {.    /* S
c950: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
c960: 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72    */ "not an err
c970: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c980: 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a  TE_ERROR       *
c990: 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72  / "SQL logic err
c9a0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c9b0: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
c9c0: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
c9d0: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
c9e0: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
c9f0: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
ca00: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
ca10: 54 20 20 20 20 20 20 20 2a 2f 20 22 71 75 65 72  T       */ "quer
ca20: 79 20 61 62 6f 72 74 65 64 22 2c 0a 20 20 20 20  y aborted",.    
ca30: 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20  /* SQLITE_BUSY  
ca40: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
ca50: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  se is locked",. 
ca60: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43     /* SQLITE_LOC
ca70: 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74  KED      */ "dat
ca80: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
ca90: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
caa0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20  QLITE_NOMEM     
cab0: 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d    */ "out of mem
cac0: 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ory",.    /* SQL
cad0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  ITE_READONLY    
cae0: 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  */ "attempt to w
caf0: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
cb00: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
cb10: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  * SQLITE_INTERRU
cb20: 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75  PT   */ "interru
cb30: 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  pted",.    /* SQ
cb40: 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20  LITE_IOERR      
cb50: 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72   */ "disk I/O er
cb60: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
cb70: 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20  ITE_CORRUPT     
cb80: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73  */ "database dis
cb90: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
cba0: 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rmed",.    /* SQ
cbb0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  LITE_NOTFOUND   
cbc0: 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65   */ "unknown ope
cbd0: 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20  ration",.    /* 
cbe0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20  SQLITE_FULL     
cbf0: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
cc00: 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22  or disk is full"
cc10: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cc20: 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22  CANTOPEN    */ "
cc30: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
cc40: 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20  atabase file",. 
cc50: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f     /* SQLITE_PRO
cc60: 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63  TOCOL    */ "loc
cc70: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a  king protocol",.
cc80: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d      /* SQLITE_EM
cc90: 50 54 59 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  PTY       */ 0,.
cca0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43      /* SQLITE_SC
ccb0: 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61  HEMA      */ "da
ccc0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
ccd0: 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20  s changed",.    
cce0: 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  /* SQLITE_TOOBIG
ccf0: 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67        */ "string
cd00: 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67   or blob too big
cd10: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cd20: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20  _CONSTRAINT  */ 
cd30: 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  "constraint fail
cd40: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cd50: 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a  TE_MISMATCH    *
cd60: 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d  / "datatype mism
cd70: 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51  atch",.    /* SQ
cd80: 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20  LITE_MISUSE     
cd90: 20 2a 2f 20 22 62 61 64 20 70 61 72 61 6d 65 74   */ "bad paramet
cda0: 65 72 20 6f 72 20 6f 74 68 65 72 20 41 50 49 20  er or other API 
cdb0: 6d 69 73 75 73 65 22 2c 0a 23 69 66 64 65 66 20  misuse",.#ifdef 
cdc0: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
cdd0: 46 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  FS.    /* SQLITE
cde0: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
cdf0: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
ce00: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
ce10: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53  ,.#else.    /* S
ce20: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
ce30: 20 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20    */ 0,.#endif. 
ce40: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54     /* SQLITE_AUT
ce50: 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74  H        */ "aut
ce60: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
ce70: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
ce80: 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f  E_FORMAT      */
ce90: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
cea0: 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f  E_RANGE       */
ceb0: 20 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f   "column index o
cec0: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
ced0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
cee0: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
cef0: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
cf00: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
cf10: 54 45 5f 4e 4f 54 49 43 45 20 20 20 20 20 20 2a  TE_NOTICE      *
cf20: 2f 20 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20  / "notification 
cf30: 6d 65 73 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a  message",.    /*
cf40: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20   SQLITE_WARNING 
cf50: 20 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20      */ "warning 
cf60: 6d 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20  message",.  };. 
cf70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
cf80: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
cf90: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
cfa0: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
cfb0: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
cfc0: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
cfd0: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
cfe0: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
cff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d000: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d010: 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ROW: {.      zEr
d020: 72 20 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f 77  r = "another row
d030: 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20   available";.   
d040: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d050: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d060: 44 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45  DONE: {.      zE
d070: 72 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f  rr = "no more ro
d080: 77 73 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20  ws available";. 
d090: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d0a0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
d0b0: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
d0c0: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
d0d0: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
d0e0: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
d0f0: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
d100: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
d110: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
d120: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d140: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
d150: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d160: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
d170: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
d180: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
d190: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
d1a0: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
d1b0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
d1c0: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
d1d0: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
d1e0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d1f0: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
d200: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
d210: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
d220: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
d230: 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 6c 6f   to retry the lo
d240: 63 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ck.  Return zero
d250: 20 74 6f 20 73 74 6f 70 20 74 72 79 69 6e 67 0a   to stop trying.
d260: 2a 2a 20 61 6e 64 20 63 61 75 73 65 20 53 51 4c  ** and cause SQL
d270: 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ite to return SQ
d280: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74  LITE_BUSY..*/.st
d290: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
d2a0: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
d2b0: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c  ck(.  void *ptr,
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d2d0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d2e0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63  ction */.  int c
d2f0: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
d300: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d310: 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73   times table has
d320: 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   been busy */.  
d330: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
d340: 69 6c 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ile      /* The 
d350: 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68  file on which th
d360: 65 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64 20  e lock occurred 
d370: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
d380: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
d390: 55 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69 73  USLEEP.  /* This
d3a0: 20 63 61 73 65 20 69 73 20 66 6f 72 20 73 79 73   case is for sys
d3b0: 74 65 6d 73 20 74 68 61 74 20 68 61 76 65 20 73  tems that have s
d3c0: 75 70 70 6f 72 74 20 66 6f 72 20 73 6c 65 65 70  upport for sleep
d3d0: 69 6e 67 20 66 6f 72 20 66 72 61 63 74 69 6f 6e  ing for fraction
d3e0: 73 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f  s of.  ** a seco
d3f0: 6e 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20  nd.  Examples:  
d400: 41 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79 73 74  All windows syst
d410: 65 6d 73 2c 20 75 6e 69 78 20 73 79 73 74 65 6d  ems, unix system
d420: 73 20 77 69 74 68 20 75 73 6c 65 65 70 28 29 20  s with usleep() 
d430: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
d440: 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a  t u8 delays[] =.
d450: 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20       { 1, 2, 5, 
d460: 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20  10, 15, 20, 25, 
d470: 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35  25,  25,  50,  5
d480: 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74  0, 100 };.  stat
d490: 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61  ic const u8 tota
d4a0: 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c  ls[] =.     { 0,
d4b0: 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33   1, 3,  8, 18, 3
d4c0: 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20  3, 53, 78, 103, 
d4d0: 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b  128, 178, 228 };
d4e0: 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59  .# define NDELAY
d4f0: 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79   ArraySize(delay
d500: 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s).  sqlite3 *db
d510: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
d520: 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d  r;.  int tmout =
d530: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d540: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
d550: 72 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53 51  rior;..#ifdef SQ
d560: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
d570: 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66 28 20  K_TIMEOUT.  if( 
d580: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
d590: 74 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54  trol(pFile,SQLIT
d5a0: 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d  E_FCNTL_LOCK_TIM
d5b0: 45 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51  EOUT,&tmout)==SQ
d5c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
d5d0: 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20  f( count ){.    
d5e0: 20 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20    tmout = 0;.   
d5f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
d600: 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53  Control(pFile, S
d610: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
d620: 5f 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74  _TIMEOUT, &tmout
d630: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d640: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
d650: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d660: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
d670: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d680: 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
d690: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
d6a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
d6b0: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
d6c0: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
d6d0: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
d6e0: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
d6f0: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
d700: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
d710: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
d720: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
d730: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
d740: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
d750: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
d760: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d  ior + delay > tm
d770: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
d780: 20 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72   = tmout - prior
d790: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
d7a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d7b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
d7c0: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
d7d0: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
d7e0: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f  urn 1;.#else.  /
d7f0: 2a 20 54 68 69 73 20 63 61 73 65 20 66 6f 72 20  * This case for 
d800: 75 6e 69 78 20 73 79 73 74 65 6d 73 20 74 68 61  unix systems tha
d810: 74 20 6c 61 63 6b 20 75 73 6c 65 65 70 28 29 20  t lack usleep() 
d820: 73 75 70 70 6f 72 74 2e 20 20 53 6c 65 65 70 69  support.  Sleepi
d830: 6e 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  ng.  ** must be 
d840: 64 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e  done in incremen
d850: 74 73 20 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f  ts of whole seco
d860: 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nds */.  sqlite3
d870: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
d880: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f  *)ptr;.  int tmo
d890: 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a  ut = ((sqlite3 *
d8a0: 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f  )ptr)->busyTimeo
d8b0: 75 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ut;.  UNUSED_PAR
d8c0: 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a 20  AMETER(pFile);. 
d8d0: 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31   if( (count+1)*1
d8e0: 30 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20  000 > tmout ){. 
d8f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d900: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
d910: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
d920: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
d930: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
d940: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
d950: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
d960: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d970: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
d980: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
d990: 66 61 69 6c 65 64 20 74 6f 20 61 63 71 75 69 72  failed to acquir
d9a0: 65 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56  e a.** lock on V
d9b0: 46 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a  FS file pFile..*
d9c0: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
d9d0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
d9e0: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
d9f0: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
da00: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
da10: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
da20: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
da30: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
da40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
da50: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
da60: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c  (BusyHandler *p,
da70: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
da80: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  File){.  int rc;
da90: 0a 20 20 69 66 28 20 70 2d 3e 78 42 75 73 79 48  .  if( p->xBusyH
daa0: 61 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e  andler==0 || p->
dab0: 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e  nBusy<0 ) return
dac0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45 78   0;.  if( p->bEx
dad0: 74 72 61 46 69 6c 65 41 72 67 20 29 7b 0a 20 20  traFileArg ){.  
dae0: 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 78 74 72    /* Add an extr
daf0: 61 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68  a parameter with
db00: 20 74 68 65 20 70 46 69 6c 65 20 70 6f 69 6e 74   the pFile point
db10: 65 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  er to the end of
db20: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   the.    ** call
db30: 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69  back argument li
db40: 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a  st */.    int (*
db50: 78 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xTra)(void*,int,
db60: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
db70: 20 20 20 20 78 54 72 61 20 3d 20 28 69 6e 74 28      xTra = (int(
db80: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c  *)(void*,int,sql
db90: 69 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78  ite3_file*))p->x
dba0: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
dbb0: 20 72 63 20 3d 20 78 54 72 61 28 70 2d 3e 70 42   rc = xTra(p->pB
dbc0: 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  usyArg, p->nBusy
dbd0: 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73  , pFile);.  }els
dbe0: 65 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63 79  e{.    /* Legacy
dbf0: 20 73 74 79 6c 65 20 62 75 73 79 20 68 61 6e 64   style busy hand
dc00: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ler callback */.
dc10: 20 20 20 20 72 63 20 3d 20 70 2d 3e 78 42 75 73      rc = p->xBus
dc20: 79 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73  yHandler(p->pBus
dc30: 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b  yArg, p->nBusy);
dc40: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
dc50: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
dc60: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
dc70: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
dc80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dc90: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
dca0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
dcb0: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
dcc0: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
dcd0: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
dce0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
dcf0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
dd00: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
dd10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
dd20: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
dd30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
dd40: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
dd50: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
dd60: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
dd70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
dd80: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
dd90: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
dda0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
ddb0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
ddc0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
ddd0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
dde0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
ddf0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78  b->busyHandler.x
de00: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
de10: 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  usy;.  db->busyH
de20: 61 6e 64 6c 65 72 2e 70 42 75 73 79 41 72 67 20  andler.pBusyArg 
de30: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
de40: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
de50: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
de60: 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c  andler.bExtraFil
de70: 65 41 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eArg = 0;.  db->
de80: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b  busyTimeout = 0;
de90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
dea0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
deb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dec0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
ded0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
dee0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
def0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
df00: 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67  ne sets the prog
df10: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ress callback fo
df20: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
df30: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
df40: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
df50: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
df60: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  given argument. 
df70: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
df80: 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65  lback will.** be
df90: 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e   invoked every n
dfa0: 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  Ops opcodes..*/.
dfb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f  void sqlite3_pro
dfc0: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20  gress_handler(. 
dfd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
dfe0: 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74   int nOps,.  int
dff0: 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f   (*xProgress)(vo
e000: 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70  id*), .  void *p
e010: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
e020: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e030: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
e040: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
e050: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
e060: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
e070: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
e080: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
e090: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e0a0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e0b0: 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a    if( nOps>0 ){.
e0c0: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
e0d0: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
e0e0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
e0f0: 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Ops = (unsigned)
e100: 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50  nOps;.    db->pP
e110: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
e120: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
e130: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
e140: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  0;.    db->nProg
e150: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
e160: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
e170: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  g = 0;.  }.  sql
e180: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e190: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  (db->mutex);.}.#
e1a0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
e1b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
e1c0: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
e1d0: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
e1e0: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
e1f0: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
e200: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
e210: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
e220: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
e230: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
e240: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
e250: 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53  nt ms){.#ifdef S
e260: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e270: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e280: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e290: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
e2a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e2b0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
e2c0: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c   ms>0 ){.    sql
e2d0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
e2e0: 72 28 64 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f  r(db, (int(*)(vo
e2f0: 69 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65 44  id*,int))sqliteD
e300: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
e310: 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20   (void*)db);.   
e340: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
e350: 20 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62   = ms;.    db->b
e360: 75 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72  usyHandler.bExtr
e370: 61 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20  aFileArg = 1;.  
e380: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e390: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
e3a0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
e3b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e3c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
e3d0: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
e3e0: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
e3f0: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
e400: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
e410: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
e420: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
e430: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
e440: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e450: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
e460: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
e470: 64 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c  db) && (db==0 ||
e480: 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49   db->magic!=SQLI
e490: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29  TE_MAGIC_ZOMBIE)
e4a0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e4b0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e4c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
e4d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75  }.#endif.  db->u
e4e0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
e4f0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
e500: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e510: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
e520: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
e530: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
e540: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
e550: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
e560: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
e570: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
e580: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
e590: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
e5a0: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
e5b0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e5c0: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
e5d0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
e5e0: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
e5f0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
e600: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
e610: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
e620: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
e630: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e640: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
e650: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e660: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
e670: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
e680: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e690: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e6a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e6b0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e6c0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e6d0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e6e0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e6f0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e700: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
e710: 76 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73  void (*xValue)(s
e720: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
e730: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e 76 65  ,.  void (*xInve
e740: 72 73 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  rse)(sqlite3_con
e750: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e760: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 46  3_value **),.  F
e770: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
e780: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
e790: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
e7a0: 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65  t nName;.  int e
e7b0: 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73  xtraFlags;..  as
e7c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e7d0: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
e7e0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e7f0: 20 78 56 61 6c 75 65 3d 3d 30 20 7c 7c 20 78 53   xValue==0 || xS
e800: 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Func==0 );.  if(
e810: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d   zFunctionName==
e820: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e830: 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 20   /* Must have a 
e840: 76 61 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  valid name */.  
e850: 20 7c 7c 20 28 78 53 46 75 6e 63 21 3d 30 20 26   || (xSFunc!=0 &
e860: 26 20 78 46 69 6e 61 6c 21 3d 30 29 20 20 20 20  & xFinal!=0)    
e870: 20 20 20 20 2f 2a 20 4e 6f 74 20 62 6f 74 68 20      /* Not both 
e880: 78 53 46 75 6e 63 20 61 6e 64 20 78 46 69 6e 61  xSFunc and xFina
e890: 6c 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 46 69  l */.   || ((xFi
e8a0: 6e 61 6c 3d 3d 30 29 21 3d 28 78 53 74 65 70 3d  nal==0)!=(xStep=
e8b0: 3d 30 29 29 20 20 20 20 20 20 20 2f 2a 20 42 6f  =0))       /* Bo
e8c0: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66  th or neither of
e8d0: 20 78 46 69 6e 61 6c 20 61 6e 64 20 78 53 74 65   xFinal and xSte
e8e0: 70 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 56 61  p */.   || ((xVa
e8f0: 6c 75 65 3d 3d 30 29 21 3d 28 78 49 6e 76 65 72  lue==0)!=(xInver
e900: 73 65 3d 3d 30 29 29 20 20 20 20 2f 2a 20 42 6f  se==0))    /* Bo
e910: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66  th or neither of
e920: 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73   xValue, xInvers
e930: 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41 72 67  e */.   || (nArg
e940: 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49  <-1 || nArg>SQLI
e950: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
e960: 41 52 47 29 0a 20 20 20 7c 7c 20 28 32 35 35 3c  ARG).   || (255<
e970: 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  (nName = sqlite3
e980: 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74  Strlen30( zFunct
e990: 69 6f 6e 4e 61 6d 65 29 29 29 0a 20 20 29 7b 0a  ionName))).  ){.
e9a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e9b0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e9c0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
e9d0: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41  LITE_FUNC_CONSTA
e9e0: 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52  NT==SQLITE_DETER
e9f0: 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78  MINISTIC );.  ex
ea00: 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26  traFlags = enc &
ea10: 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49    SQLITE_DETERMI
ea20: 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d  NISTIC;.  enc &=
ea30: 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e   (SQLITE_FUNC_EN
ea40: 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59  CMASK|SQLITE_ANY
ea50: 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51  );.  .#ifndef SQ
ea60: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
ea70: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
ea80: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
ea90: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
eaa0: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
eab0: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
eac0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
ead0: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
eae0: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
eaf0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
eb00: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
eb10: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
eb20: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
eb30: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
eb40: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
eb50: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
eb60: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
eb70: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
eb80: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
eb90: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
eba0: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
ebb0: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
ebc0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
ebd0: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
ebe0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
ebf0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
ec00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
ec10: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
ec20: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
ec30: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65  g, SQLITE_UTF8|e
ec40: 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20  xtraFlags,.     
ec50: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
ec60: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  SFunc, xStep, xF
ec70: 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49  inal, xValue, xI
ec80: 6e 76 65 72 73 65 2c 20 70 44 65 73 74 72 75 63  nverse, pDestruc
ec90: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tor);.    if( rc
eca0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ecb0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ecc0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ecd0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
ece0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
ecf0: 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  6LE|extraFlags,.
ed00: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
ed10: 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  ata, xSFunc, xSt
ed20: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c  ep, xFinal, xVal
ed30: 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70 44  ue, xInverse, pD
ed40: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
ed50: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
ed60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ed70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ed80: 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  }.    enc = SQLI
ed90: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a  TE_UTF16BE;.  }.
eda0: 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51  #else.  enc = SQ
edb0: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69  LITE_UTF8;.#endi
edc0: 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  f.  .  /* Check 
edd0: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66  if an existing f
ede0: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
edf0: 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64   overridden or d
ee00: 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20  eleted. If so,. 
ee10: 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
ee20: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68  e active VMs, th
ee30: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
ee40: 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63  _BUSY. If a func
ee50: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69  tion.  ** is bei
ee60: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65  ng overridden/de
ee70: 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20  leted but there 
ee80: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
ee90: 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a  s, allow the.  *
eea0: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63  * operation to c
eeb0: 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61  ontinue but inva
eec0: 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f  lidate all preco
eed0: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
eee0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  s..  */.  p = sq
eef0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
ef00: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
ef10: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
ef20: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
ef30: 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73  && (p->funcFlags
ef40: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
ef50: 4e 43 4d 41 53 4b 29 3d 3d 28 75 33 32 29 65 6e  NCMASK)==(u32)en
ef60: 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41  c && p->nArg==nA
ef70: 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  rg ){.    if( db
ef80: 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
ef90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
efa0: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
efb0: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
efc0: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
efd0: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73  delete/modify us
efe0: 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20  er-function due 
eff0: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
f000: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73  ents");.      as
f010: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
f020: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
f030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
f040: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
f050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f060: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
f070: 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20  ments(db, 0);.  
f080: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
f090: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
f0a0: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
f0b0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
f0c0: 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  enc, 1);.  asser
f0d0: 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  t(p || db->mallo
f0e0: 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
f0f0: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
f100: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f110: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
f120: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
f130: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
f140: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
f150: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
f160: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
f170: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
f180: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
f190: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
f1a0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
f1b0: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
f1c0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
f1d0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
f1e0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
f1f0: 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  u.pDestructor = 
f200: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
f210: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70  ->funcFlags = (p
f220: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
f230: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
f240: 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b  K) | extraFlags;
f250: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
f260: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
f270: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
f280: 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20   );.  p->xSFunc 
f290: 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e  = xSFunc ? xSFun
f2a0: 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  c : xStep;.  p->
f2b0: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
f2c0: 61 6c 3b 0a 20 20 70 2d 3e 78 56 61 6c 75 65 20  al;.  p->xValue 
f2d0: 3d 20 78 56 61 6c 75 65 3b 0a 20 20 70 2d 3e 78  = xValue;.  p->x
f2e0: 49 6e 76 65 72 73 65 20 3d 20 78 49 6e 76 65 72  Inverse = xInver
f2f0: 73 65 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  se;.  p->pUserDa
f300: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
f310: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36    p->nArg = (u16
f320: 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  )nArg;.  return 
f330: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f340: 0a 2a 2a 20 57 6f 72 6b 65 72 20 66 75 6e 63 74  .** Worker funct
f350: 69 6f 6e 20 75 73 65 64 20 62 79 20 75 74 66 2d  ion used by utf-
f360: 38 20 41 50 49 73 20 74 68 61 74 20 63 72 65 61  8 APIs that crea
f370: 74 65 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 73  te new functions
f380: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
f390: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f3a0: 6f 6e 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74  on().**    sqlit
f3b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f3c0: 6f 6e 5f 76 32 28 29 0a 2a 2a 20 20 20 20 73 71  on_v2().**    sq
f3d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e  lite3_create_win
f3e0: 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a  dow_function().*
f3f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
f400: 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 0a  ateFunctionApi(.
f410: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
f430: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
f440: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
f450: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
f460: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
f470: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
f480: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
f490: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
f4a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f4b0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f4c0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
f4d0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
f4e0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
f4f0: 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65  (*xValue)(sqlite
f500: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
f510: 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28  oid (*xInverse)(
f520: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f530: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
f540: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  ue**),.  void(*x
f550: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 0a  Destroy)(void*).
f560: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f570: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75  LITE_ERROR;.  Fu
f580: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41  ncDestructor *pA
f590: 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  rg = 0;..#ifdef 
f5a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f5b0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f5c0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f5d0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
f5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
f5f0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
f600: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
f610: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f620: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
f630: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
f640: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
f650: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  tor *)sqlite3Mal
f660: 6c 6f 63 28 73 69 7a 65 6f 66 28 46 75 6e 63 44  loc(sizeof(FuncD
f670: 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20  estructor));.   
f680: 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20   if( !pArg ){.  
f690: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
f6a0: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 78  ult(db);.      x
f6b0: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
f6c0: 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20    goto out;.    
f6d0: 7d 0a 20 20 20 20 70 41 72 67 2d 3e 6e 52 65 66  }.    pArg->nRef
f6e0: 20 3d 20 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e   = 0;.    pArg->
f6f0: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
f700: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
f710: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
f720: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
f730: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
f740: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
f750: 20 70 2c 20 0a 20 20 20 20 20 20 78 53 46 75 6e   p, .      xSFun
f760: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
f770: 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72  , xValue, xInver
f780: 73 65 2c 20 70 41 72 67 0a 20 20 29 3b 0a 20 20  se, pArg.  );.  
f790: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
f7a0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
f7b0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
f7c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
f7d0: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
f7e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72 67  qlite3_free(pArg
f7f0: 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20  );.  }.. out:.  
f800: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
f810: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
f820: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f830: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f850: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
f860: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
f870: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
f880: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
f890: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f8a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
f8b0: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
f8c0: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
f8d0: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
f8e0: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
f8f0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
f900: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
f910: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
f920: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
f930: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
f940: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
f950: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
f960: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72  context*).){.  r
f970: 65 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63  eturn createFunc
f980: 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e  tionApi(db, zFun
f990: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
f9a0: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a   xSFunc, xStep,.
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30      xFinal, 0, 0
f9e0: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
f9f0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
fa00: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
fa10: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
fa20: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
fa30: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
fa40: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
fa50: 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73  void (*xSFunc)(s
fa60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
fa70: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
fa80: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
fa90: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
faa0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
fab0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
fac0: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
fad0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
fae0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  ),.  void (*xDes
faf0: 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b  troy)(void *).){
fb00: 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61 74 65  .  return create
fb10: 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20  FunctionApi(db, 
fb20: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
fb30: 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  , p, xSFunc, xSt
fb40: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
fb70: 30 2c 20 30 2c 20 78 44 65 73 74 72 6f 79 29 3b  0, 0, xDestroy);
fb80: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  .}.int sqlite3_c
fb90: 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e  reate_window_fun
fba0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
fbb0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
fbc0: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
fbd0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
fbe0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
fbf0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
fc00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fc10: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
fc20: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
fc30: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
fc40: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
fc50: 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65  (*xValue)(sqlite
fc60: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
fc70: 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28  oid (*xInverse)(
fc80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
fc90: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
fca0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
fcb0: 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20  *xDestroy)(void 
fcc0: 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  *).){.  return c
fcd0: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69  reateFunctionApi
fce0: 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67  (db, zFunc, nArg
fcf0: 2c 20 65 6e 63 2c 20 70 2c 20 30 2c 20 78 53 74  , enc, p, 0, xSt
fd00: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
fd30: 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65  xValue, xInverse
fd40: 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a  , xDestroy);.}..
fd50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fd60: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
fd70: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
fd80: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
fd90: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
fda0: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
fdb0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
fdc0: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
fdd0: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
fde0: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
fdf0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fe00: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
fe10: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
fe20: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
fe30: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
fe40: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
fe50: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
fe60: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
fe70: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
fe80: 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64  r *zFunc8;..#ifd
fe90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
fea0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
feb0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
fec0: 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46  heckOk(db) || zF
fed0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29  unctionName==0 )
fee0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
fef0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
ff00: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
ff10: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ff20: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
ff30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ff40: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
ff50: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
ff60: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
ff70: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
ff80: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
ff90: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
ffa0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
ffb0: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
ffc0: 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c  p, xSFunc,xStep,
ffd0: 78 46 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20  xFinal,0,0,0);. 
ffe0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fff0: 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63  b, zFunc8);.  rc
10000 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
10010 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
10020 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10030 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
10050 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
10060 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
10070 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
10080 66 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f  f an SQL functio
10090 6e 20 74 68 61 74 20 61 6c 77 61 79 73 0a 2a 2a  n that always.**
100a0 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20 65   fails with an e
100b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 61  rror message sta
100c0 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 66 75  ting that the fu
100d0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  nction is used i
100e0 6e 20 74 68 65 0a 2a 2a 20 77 72 6f 6e 67 20 63  n the.** wrong c
100f0 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 73 71 6c  ontext.  The sql
10100 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
10110 6e 63 74 69 6f 6e 28 29 20 41 50 49 20 6d 69 67  nction() API mig
10120 68 74 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20  ht construct.** 
10130 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  SQL function tha
10140 74 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  t use this routi
10150 6e 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  ne so that the f
10160 75 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20 65 78  unctions will ex
10170 69 73 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65 20  ist.** for name 
10180 72 65 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20 61  resolution but a
10190 72 65 20 61 63 74 75 61 6c 6c 79 20 6f 76 65 72  re actually over
101a0 6c 6f 61 64 65 64 20 62 79 20 74 68 65 20 78 46  loaded by the xF
101b0 69 6e 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  indFunction.** m
101c0 65 74 68 6f 64 20 6f 66 20 76 69 72 74 75 61 6c  ethod of virtual
101d0 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
101e0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 49  ic void sqlite3I
101f0 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 28 0a  nvalidFunction(.
10200 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
10210 74 20 2a 63 6f 6e 74 65 78 74 2c 20 20 2f 2a 20  t *context,  /* 
10220 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  The function cal
10230 6c 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ling context */.
10240 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 20    int NotUsed,  
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10260 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
10270 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
10280 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
10290 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
102a0 32 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20  2   /* Value of 
102b0 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
102c0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
102d0 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
102e0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 75   char*)sqlite3_u
102f0 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
10300 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  );.  char *zErr;
10310 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10320 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
10330 74 55 73 65 64 32 29 3b 0a 20 20 7a 45 72 72 20  tUsed2);.  zErr 
10340 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10350 66 28 0a 20 20 20 20 20 20 22 75 6e 61 62 6c 65  f(.      "unable
10360 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
10370 20 25 73 20 69 6e 20 74 68 65 20 72 65 71 75 65   %s in the reque
10380 73 74 65 64 20 63 6f 6e 74 65 78 74 22 2c 20 7a  sted context", z
10390 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
103a0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
103b0 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29  ntext, zErr, -1)
103c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
103d0 28 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (zErr);.}../*.**
103e0 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
103f0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
10400 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
10410 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
10420 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
10430 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
10440 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
10450 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
10460 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
10470 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
10480 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
10490 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
104a0 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
104b0 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
104c0 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
104d0 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
104e0 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
104f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
10500 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
10510 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
10520 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
10530 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
10540 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
10550 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
10560 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
10570 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
10580 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
10590 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
105a0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
105b0 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
105c0 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
105d0 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
105e0 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
105f0 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
10600 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
10610 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
10620 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70  rc;.  char *zCop
10630 79 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  y;..#ifdef SQLIT
10640 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10650 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10660 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10670 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c  b) || zName==0 |
10680 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20  | nArg<-2 ){.   
10690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
106a0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
106b0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
106c0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
106d0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20  >mutex);.  rc = 
106e0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
106f0 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
10700 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
10710 2c 20 30 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  , 0)!=0;.  sqlit
10720 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10730 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
10740 20 72 63 20 29 20 72 65 74 75 72 6e 20 53 51 4c   rc ) return SQL
10750 49 54 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20  ITE_OK;.  zCopy 
10760 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10770 66 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  f(zName);.  if( 
10780 7a 43 6f 70 79 3d 3d 30 20 29 20 72 65 74 75 72  zCopy==0 ) retur
10790 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
107a0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
107b0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
107c0 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  _v2(db, zName, n
107d0 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
107e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
10800 70 79 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c  py, sqlite3Inval
10810 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
10820 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
10830 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10840 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
10850 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
10860 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
10870 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
10880 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
10890 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
108a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
108b0 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
108c0 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
108d0 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
108e0 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
108f0 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
10900 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
10910 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
10920 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
10930 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
10940 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
10950 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ment..*/.#ifndef
10960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
10970 52 45 43 41 54 45 44 0a 76 6f 69 64 20 2a 73 71  RECATED.void *sq
10980 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69  lite3_trace(sqli
10990 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78  te3 *db, void(*x
109a0 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  Trace)(void*,con
109b0 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20  st char*), void 
109c0 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a  *pArg){.  void *
109d0 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOld;..#ifdef SQ
109e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
109f0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
10a00 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
10a10 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
10a20 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
10a30 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
10a40 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
10a50 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10a60 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10a70 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
10a80 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e  TraceArg;.  db->
10a90 6d 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 20  mTrace = xTrace 
10aa0 3f 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c  ? SQLITE_TRACE_L
10ab0 45 47 41 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d  EGACY : 0;.  db-
10ac0 3e 78 54 72 61 63 65 20 3d 20 28 69 6e 74 28 2a  >xTrace = (int(*
10ad0 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64  )(u32,void*,void
10ae0 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61 63 65 3b  *,void*))xTrace;
10af0 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
10b00 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
10b10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10b20 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10b30 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64  urn pOld;.}.#end
10b40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10b50 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a  T_DEPRECATED */.
10b60 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  ./* Register a t
10b70 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 75 73  race callback us
10b80 69 6e 67 20 74 68 65 20 76 65 72 73 69 6f 6e 2d  ing the version-
10b90 32 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  2 interface..*/.
10ba0 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63  int sqlite3_trac
10bb0 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  e_v2(.  sqlite3 
10bc0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10be0 20 20 20 2f 2a 20 54 72 61 63 65 20 74 68 69 73     /* Trace this
10bf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
10c00 20 75 6e 73 69 67 6e 65 64 20 6d 54 72 61 63 65   unsigned mTrace
10c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10c30 61 73 6b 20 6f 66 20 65 76 65 6e 74 73 20 74 6f  ask of events to
10c40 20 62 65 20 74 72 61 63 65 64 20 2a 2f 0a 20 20   be traced */.  
10c50 69 6e 74 28 2a 78 54 72 61 63 65 29 28 75 6e 73  int(*xTrace)(uns
10c60 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64  igned,void*,void
10c70 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61  *,void*),  /* Ca
10c80 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65  llback to invoke
10c90 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29   /* Context */.)
10cd0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
10ce0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10cf0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10d00 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10d10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10d20 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10d30 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
10d40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10d50 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10d60 20 20 69 66 28 20 6d 54 72 61 63 65 3d 3d 30 20    if( mTrace==0 
10d70 29 20 78 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  ) xTrace = 0;.  
10d80 69 66 28 20 78 54 72 61 63 65 3d 3d 30 20 29 20  if( xTrace==0 ) 
10d90 6d 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 64 62  mTrace = 0;.  db
10da0 2d 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72 61 63  ->mTrace = mTrac
10db0 65 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  e;.  db->xTrace 
10dc0 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
10dd0 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
10de0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
10df0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
10e00 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
10e10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
10e20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
10e30 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
10e40 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69  Register a profi
10e50 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  le function.  Th
10e60 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
10e70 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
10e80 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c  tered .** profil
10e90 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  e function is re
10ea0 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
10eb0 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66  A NULL profile f
10ec0 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
10ed0 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20  at no profiling 
10ee0 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
10ef0 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66  non-NULL.** prof
10f00 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ile is a pointer
10f10 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
10f20 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
10f30 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
10f40 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20   of.** each SQL 
10f50 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
10f60 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  s run..*/.void *
10f70 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
10f80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
10f90 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c    void (*xProfil
10fa0 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
10fb0 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74  har*,sqlite_uint
10fc0 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
10fd0 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  g.){.  void *pOl
10fe0 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
10ff0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
11000 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
11010 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
11020 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
11030 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
11040 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
11050 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
11060 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
11070 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
11080 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
11090 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
110a0 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
110b0 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
110c0 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
110d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
110e0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
110f0 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
11100 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11110 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
11120 44 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  D */.#endif /* S
11130 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
11140 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
11150 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74  ter a function t
11160 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65  o be invoked whe
11170 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
11180 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74  commits..** If t
11190 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74  he invoked funct
111a0 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ion returns non-
111b0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63  zero, then the c
111c0 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a  ommit becomes a.
111d0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  ** rollback..*/.
111e0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f  void *sqlite3_co
111f0 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  mmit_hook(.  sql
11200 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
11210 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
11220 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
11230 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
11240 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  int (*xCallback)
11250 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e  (void*),  /* Fun
11260 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20  ction to invoke 
11270 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a  on each commit *
11280 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112a0 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
112b0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
112c0 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
112d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
112e0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
112f0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
11300 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
11310 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
11320 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
11330 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11340 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
11350 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
11360 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
11370 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72   = db->pCommitAr
11380 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  g;.  db->xCommit
11390 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
113a0 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d  back;.  db->pCom
113b0 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  mitArg = pArg;. 
113c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
113d0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
113e0 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
113f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
11400 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
11410 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
11420 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70  time a row is up
11430 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74  dated,.** insert
11440 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73  ed or deleted us
11450 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
11460 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
11470 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75  .void *sqlite3_u
11480 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71  pdate_hook(.  sq
11490 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
114a0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
114b0 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
114c0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
114d0 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
114e0 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
114f0 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63  r const *,char c
11500 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e  onst *,sqlite_in
11510 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
11520 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
11530 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
11540 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
11550 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
11560 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
11570 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
11580 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
11590 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
115a0 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
115b0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
115c0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
115d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
115e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
115f0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
11600 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61  pRet = db->pUpda
11610 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70  teArg;.  db->xUp
11620 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78  dateCallback = x
11630 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
11640 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  pUpdateArg = pAr
11650 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
11660 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11670 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
11680 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  et;.}../*.** Reg
11690 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
116a0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
116b0 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
116c0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
116d0 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73  .** back by this
116e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
116f0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
11700 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
11710 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
11720 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
11730 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
11740 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
11750 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
11760 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
11770 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  d*), /* Callback
11780 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
11790 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
117a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
117b0 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
117c0 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
117d0 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66  d *pRet;..#ifdef
117e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
117f0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
11800 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
11810 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
11820 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
11830 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
11840 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
11850 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
11860 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
11870 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
11880 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a  ->pRollbackArg;.
11890 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
118a0 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
118b0 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c  ack;.  db->pRoll
118c0 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a  backArg = pArg;.
118d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
118e0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
118f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
11900 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
11910 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
11920 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65  TE_HOOK./*.** Re
11930 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
11940 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
11950 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
11960 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
11970 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
11980 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
11990 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
119a0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
119b0 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f  te3_preupdate_ho
119c0 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
119d0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
119e0 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
119f0 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
11a00 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78  ase */.  void(*x
11a10 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20 20 20  Callback)(      
11a20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
11a30 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76  unction */.    v
11a40 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
11a50 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68  t,char const*,ch
11a60 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65  ar const*,sqlite
11a70 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f  3_int64,sqlite3_
11a80 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
11a90 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
11aa0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c      /* First cal
11ab0 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a  lback argument *
11ac0 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
11ad0 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
11ae0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
11af0 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
11b00 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 3b  ->pPreUpdateArg;
11b10 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74  .  db->xPreUpdat
11b20 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  eCallback = xCal
11b30 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72  lback;.  db->pPr
11b40 65 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  eUpdateArg = pAr
11b50 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
11b60 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11b70 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
11b80 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  et;.}.#endif /* 
11b90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
11ba0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
11bb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11bc0 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
11bd0 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  he sqlite3_wal_h
11be0 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72  ook() callback r
11bf0 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c  egistered by sql
11c00 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
11c10 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e  ckpoint()..** In
11c20 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c  voke sqlite3_wal
11c30 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74  _checkpoint if t
11c40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
11c50 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
11c60 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
11c70 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70  r than sqlite3.p
11c80 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61  WalArg cast to a
11c90 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76  n integer (the v
11ca0 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
11cb0 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68  by.** wal_autoch
11cc0 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20  eckpoint())..*/ 
11cd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44  .int sqlite3WalD
11ce0 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f  efaultHook(.  vo
11cf0 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c  id *pClientData,
11d00 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
11d10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
11d20 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b,           /* 
11d30 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  Connection */.  
11d40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
11d50 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
11d60 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61  se */.  int nFra
11d70 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  me             /
11d80 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f  * Size of WAL */
11d90 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  .){.  if( nFrame
11da0 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  >=SQLITE_PTR_TO_
11db0 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29  INT(pClientData)
11dc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
11dd0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
11de0 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
11df0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64  wal_checkpoint(d
11e00 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c  b, zDb);.    sql
11e10 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
11e20 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  loc();.  }.  ret
11e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11e40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11e50 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
11e60 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61  *.** Configure a
11e70 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  n sqlite3_wal_ho
11e80 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ok() callback to
11e90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
11ea0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64  heckpoint.** a d
11eb0 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f  atabase after co
11ec0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
11ed0 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
11ee0 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a  are nFrame or.**
11ef0 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20   more frames in 
11f00 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61  the log file. Pa
11f10 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20  ssing zero or a 
11f20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61  negative value a
11f30 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20  s the.** nFrame 
11f40 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c  parameter disabl
11f50 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  es automatic che
11f60 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c  ckpoints entirel
11f70 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
11f80 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
11f90 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
11fa0 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65  n replaces any e
11fb0 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b  xisting callback
11fc0 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75  .** registered u
11fd0 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
11fe0 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73  _hook(). Likewis
11ff0 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61  e, registering a
12000 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69   callback.** usi
12010 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
12020 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74  ook() disables t
12030 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  he automatic che
12040 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73  ckpoint mechanis
12050 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  m.** configured 
12060 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
12070 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12080 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
12090 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
120a0 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69   int nFrame){.#i
120b0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
120c0 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41  _WAL.  UNUSED_PA
120d0 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
120e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
120f0 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23  nFrame);.#else.#
12100 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12110 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
12120 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
12130 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
12140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
12150 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
12160 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30  f.  if( nFrame>0
12170 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12180 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c  wal_hook(db, sql
12190 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
121a0 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ok, SQLITE_INT_T
121b0 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a  O_PTR(nFrame));.
121c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
121d0 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
121e0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
121f0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
12200 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12210 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
12220 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
12230 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
12240 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72  ransaction is wr
12250 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68  itten.** into th
12260 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f  e write-ahead-lo
12270 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  g by this databa
12280 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
12290 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
122a0 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  wal_hook(.  sqli
122b0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
122c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
122d0 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
122e0 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65  o this db handle
122f0 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c   */.  int(*xCall
12300 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71  back)(void *, sq
12310 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68  lite3*, const ch
12320 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69  ar*, int),.  voi
12330 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12350 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  First argument p
12360 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61  assed to xCallba
12370 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  ck() */.){.#ifnd
12380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
12390 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  AL.  void *pRet;
123a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
123b0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
123c0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
123d0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
123e0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
123f0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
12400 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12410 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
12420 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
12430 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
12440 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67  et = db->pWalArg
12450 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c  ;.  db->xWalCall
12460 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
12470 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20  ;.  db->pWalArg 
12480 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
12490 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
124a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
124b0 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20  rn pRet;.#else. 
124c0 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
124d0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  f.}../*.** Check
124e0 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
124f0 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  Db..*/.int sqlit
12500 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
12510 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  t_v2(.  sqlite3 
12520 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12530 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12540 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
12550 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63  /* Name of attac
12580 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72  hed database (or
12590 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20   NULL) */.  int 
125a0 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  eMode,          
125b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
125c0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
125d0 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  _* value */.  in
125e0 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20  t *pnLog,       
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12600 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41   OUT: Size of WA
12610 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20  L log in frames 
12620 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74  */.  int *pnCkpt
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74       /* OUT: Tot
12650 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  al number of fra
12660 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  mes checkpointed
12670 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51   */.){.#ifdef SQ
12680 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
12690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
126a0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
126b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
126c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
126d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
126e0 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d  t iDb = SQLITE_M
126f0 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a  AX_ATTACHED;  /*
12700 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69   sqlite3.aDb[] i
12710 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68  ndex of db to ch
12720 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66  eckpoint */..#if
12730 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12740 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
12750 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
12760 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
12770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
12780 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
12790 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
127a0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
127b0 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63  ables to -1 in c
127c0 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
127d0 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e  urs. */.  if( pn
127e0 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d  Log ) *pnLog = -
127f0 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20  1;.  if( pnCkpt 
12800 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a  ) *pnCkpt = -1;.
12810 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
12820 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
12830 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73  SIVE==0 );.  ass
12840 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
12850 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29  KPOINT_FULL==1 )
12860 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
12870 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
12880 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73  START==2 );.  as
12890 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
128a0 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45  CKPOINT_TRUNCATE
128b0 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  ==3 );.  if( eMo
128c0 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de<SQLITE_CHECKP
128d0 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20  OINT_PASSIVE || 
128e0 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45  eMode>SQLITE_CHE
128f0 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45  CKPOINT_TRUNCATE
12900 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
12910 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d  NCE-OF: R-03996-
12920 31 32 30 38 38 20 54 68 65 20 4d 20 70 61 72 61  12088 The M para
12930 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20  meter must be a 
12940 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e 74  valid checkpoint
12950 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f  .    ** mode: */
12960 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12970 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a  TE_MISUSE;.  }..
12980 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12990 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
129a0 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a  ;.  if( zDb && z
129b0 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62  Db[0] ){.    iDb
129c0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
129d0 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
129e0 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29   }.  if( iDb<0 )
129f0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12a00 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
12a10 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
12a20 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
12a30 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  R, "unknown data
12a40 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b  base: %s", zDb);
12a50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
12a60 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
12a70 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  usy = 0;.    rc 
12a80 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f  = sqlite3Checkpo
12a90 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f  int(db, iDb, eMo
12aa0 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
12ab0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
12ac0 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
12ad0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
12ae0 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
12af0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
12b00 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 74  are no active st
12b10 61 74 65 6d 65 6e 74 73 2c 20 63 6c 65 61 72 20  atements, clear 
12b20 74 68 65 20 69 6e 74 65 72 72 75 70 74 20 66 6c  the interrupt fl
12b30 61 67 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ag at this.  ** 
12b40 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 69 66 28  point.  */.  if(
12b50 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
12b60 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 75  ==0 ){.    db->u
12b70 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
12b80 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  = 0;.  }..  sqli
12b90 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
12ba0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
12bb0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
12bc0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  }.../*.** Checkp
12bd0 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
12be0 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c  b. If zDb is NUL
12bf0 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66  L, or if the buf
12c00 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a  fer zDb points.*
12c10 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20  * to contains a 
12c20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69  zero-length stri
12c30 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64  ng, all attached
12c40 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a   databases are .
12c50 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
12c60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
12c70 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73  wal_checkpoint(s
12c80 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
12c90 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
12ca0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
12cb0 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54 68  R-41613-20553 Th
12cc0 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
12cd0 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69 73  eckpoint(D,X) is
12ce0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
12cf0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   ** sqlite3_wal_
12d00 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c  checkpoint_v2(D,
12d10 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  X,SQLITE_CHECKPO
12d20 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29  INT_PASSIVE,0,0)
12d30 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71  . */.  return sq
12d40 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
12d50 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53  oint_v2(db,zDb,S
12d60 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
12d70 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d  _PASSIVE,0,0);.}
12d80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12d90 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
12da0 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  Run a checkpoint
12db0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   on database iDb
12dc0 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
12dd0 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44  p if database iD
12de0 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  b is.** not curr
12df0 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41  ently open in WA
12e00 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L mode..**.** If
12e10 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
12e20 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
12e30 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65  tabase being che
12e40 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20  ckpointed, this 
12e50 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
12e60 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
12e70 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f  ED and a checkpo
12e80 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  int is not attem
12e90 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  pted. If .** an 
12ea0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
12eb0 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  le running the c
12ec0 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51  heckpoint, an SQ
12ed0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
12ee0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
12ef0 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (i.e. SQLITE_IOE
12f00 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  RR). Otherwise, 
12f10 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
12f20 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   The mutex on da
12f30 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
12f40 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
12f50 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  by the caller. T
12f60 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f  he mutex.** asso
12f70 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
12f80 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20  specific b-tree 
12f90 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
12fa0 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a  ed is taken by.*
12fb0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
12fc0 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70  while the checkp
12fd0 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  oint is running.
12fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73  .**.** If iDb is
12ff0 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d   passed SQLITE_M
13000 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65  AX_ATTACHED, the
13010 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
13020 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20  atabases are.** 
13030 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66  checkpointed. If
13040 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
13050 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72  ountered it is r
13060 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
13070 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65  ely -.** no atte
13080 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
13090 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65  heckpoint any re
130a0 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65  maining database
130b0 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  s..**.** Paramet
130c0 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20  er eMode is one 
130d0 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  of SQLITE_CHECKP
130e0 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55  OINT_PASSIVE, FU
130f0 4c 4c 2c 20 52 45 53 54 41 52 54 0a 2a 2a 20 6f  LL, RESTART.** o
13100 72 20 54 52 55 4e 43 41 54 45 2e 0a 2a 2f 0a 69  r TRUNCATE..*/.i
13110 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70  nt sqlite3Checkp
13120 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
13130 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65  , int iDb, int e
13140 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67  Mode, int *pnLog
13150 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a  , int *pnCkpt){.
13160 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13170 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
13180 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
13190 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
131c0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
131d0 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f   attached dbs */
131e0 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30  .  int bBusy = 0
131f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13200 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51     /* True if SQ
13210 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62 65  LITE_BUSY has be
13220 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  en encountered *
13230 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
13240 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13250 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
13260 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c  assert( !pnLog |
13270 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a  | *pnLog==-1 );.
13280 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70    assert( !pnCkp
13290 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31  t || *pnCkpt==-1
132a0 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   );..  for(i=0; 
132b0 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d  i<db->nDb && rc=
132c0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
132d0 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62  {.    if( i==iDb
132e0 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f   || iDb==SQLITE_
132f0 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a  MAX_ATTACHED ){.
13300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13310 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e  e3BtreeCheckpoin
13320 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  t(db->aDb[i].pBt
13330 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
13340 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70  pnCkpt);.      p
13350 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nLog = 0;.      
13360 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20  pnCkpt = 0;.    
13370 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13380 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
13390 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20   bBusy = 1;.    
133a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
133b0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
133c0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
133d0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
133e0 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54  & bBusy) ? SQLIT
133f0 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23  E_BUSY : rc;.}.#
13400 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13410 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
13420 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13430 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
13440 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f   main-memory sho
13450 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73 74  uld be used inst
13460 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70  ead of.** a temp
13470 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74  orary file for t
13480 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66  ransient pager f
13490 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65  iles and stateme
134a0 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  nt journals..** 
134b0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
134c0 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
134d0 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74  e value of db->t
134e0 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69  emp_store (runti
134f0 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29  me.** parameter)
13500 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
13510 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53   time value of S
13520 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13530 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  . The.** followi
13540 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
13550 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  es the relations
13560 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 73  hip between thes
13570 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
13580 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
13590 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ns return value.
135a0 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
135b0 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64  TEMP_STORE     d
135c0 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20  b->temp_store   
135d0 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65    Location of te
135e0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
135f0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
13600 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
13610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
13620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
13640 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13650 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
13660 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
13670 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
13680 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
13690 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
136b0 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
136c0 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
13700 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20  urn 1).**   1   
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
13730 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
13740 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
13770 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
13780 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
13790 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
137a0 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
137b0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
137c0 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
137d0 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
137e0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
13800 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
13810 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20  1).**   3       
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
13830 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
13840 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
13850 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1).*/.int sql
13860 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
13870 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a  (const sqlite3 *
13880 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  db){.#if SQLITE_
13890 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20  TEMP_STORE==1.  
138a0 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
138b0 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65  p_store==2 );.#e
138c0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
138d0 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20  TEMP_STORE==2.  
138e0 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
138f0 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65  p_store!=1 );.#e
13900 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13910 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20  TEMP_STORE==3.  
13920 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13930 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  (db);.  return 1
13940 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
13950 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31  ITE_TEMP_STORE<1
13960 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   || SQLITE_TEMP_
13970 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53 45 44  STORE>3.  UNUSED
13980 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
13990 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
139a0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
139b0 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  rn UTF-8 encoded
139c0 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
139d0 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
139e0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
139f0 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
13a00 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
13a10 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33  3_errmsg(sqlite3
13a20 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63   *db){.  const c
13a30 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  har *z;.  if( !d
13a40 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
13a50 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
13a60 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
13a70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
13a80 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
13a90 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
13aa0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
13ab0 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d  3ErrStr(SQLITE_M
13ac0 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d  ISUSE_BKPT);.  }
13ad0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13ae0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
13af0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
13b00 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
13b10 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
13b20 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  tr(SQLITE_NOMEM_
13b30 42 4b 50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  BKPT);.  }else{.
13b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
13b50 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20  ->pErr==0 );.   
13b60 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69   z = (char*)sqli
13b70 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64  te3_value_text(d
13b80 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73  b->pErr);.    as
13b90 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
13ba0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
13bb0 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
13bc0 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
13bd0 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b  tr(db->errCode);
13be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
13bf0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13c00 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
13c10 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
13c20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13c30 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
13c40 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
13c50 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
13c60 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
13c70 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
13c80 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
13c90 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
13ca0 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
13cb0 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
13cc0 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74  ic const u16 out
13cd0 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20  OfMem[] = {.    
13ce0 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
13cf0 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20   ', 'o', 'f', ' 
13d00 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27  ', 'm', 'e', 'm'
13d10 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'o', 'r', 'y',
13d20 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63   0.  };.  static
13d30 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73   const u16 misus
13d40 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 62 27 2c  e[] = {.    'b',
13d50 20 27 61 27 2c 20 27 64 27 2c 20 27 20 27 2c 20   'a', 'd', ' ', 
13d60 27 70 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27  'p', 'a', 'r', '
13d70 61 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 74  a', 'm', 'e', 't
13d80 27 2c 20 27 65 27 2c 20 27 72 27 2c 20 27 20 27  ', 'e', 'r', ' '
13d90 2c 0a 20 20 20 20 27 6f 27 2c 20 27 72 27 2c 20  ,.    'o', 'r', 
13da0 27 20 27 2c 20 27 6f 27 2c 20 27 74 27 2c 20 27  ' ', 'o', 't', '
13db0 68 27 2c 20 27 65 27 2c 20 27 72 27 2c 20 27 20  h', 'e', 'r', ' 
13dc0 27 2c 20 27 41 27 2c 20 27 50 27 2c 20 27 49 27  ', 'A', 'P', 'I'
13dd0 2c 20 27 20 27 2c 0a 20 20 20 20 27 6d 27 2c 20  , ' ',.    'm', 
13de0 27 69 27 2c 20 27 73 27 2c 20 27 75 27 2c 20 27  'i', 's', 'u', '
13df0 73 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a  s', 'e', 0.  };.
13e00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
13e10 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ;.  if( !db ){. 
13e20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
13e30 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a  *)outOfMem;.  }.
13e40 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
13e50 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
13e60 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
13e70 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75  urn (void *)misu
13e80 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  se;.  }.  sqlite
13e90 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
13ea0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
13eb0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13ec0 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69   ){.    z = (voi
13ed0 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
13ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
13ef0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
13f00 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  t16(db->pErr);. 
13f10 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
13f20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13f30 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64 62 2d  rWithMsg(db, db-
13f40 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69 74 65  >errCode, sqlite
13f50 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
13f60 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a 20 3d  ode));.      z =
13f70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
13f80 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
13f90 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20  .    }.    /* A 
13fa0 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76  malloc() may hav
13fb0 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20  e failed within 
13fc0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
13fd0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
13fe0 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e  ().    ** above.
13ff0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
14000 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64  case, then the d
14010 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14020 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20  flag needs to.  
14030 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20    ** be cleared 
14040 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
14050 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63 74  . Do this direct
14060 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76  ly, instead of v
14070 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  ia.    ** sqlite
14080 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61  3ApiExit(), to a
14090 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68 65  void setting the
140a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
140b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
140c0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
140d0 65 33 4f 6f 6d 43 6c 65 61 72 28 64 62 29 3b 0a  e3OomClear(db);.
140e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
140f0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
14100 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
14110 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
14120 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
14130 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
14140 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
14150 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65   error code gene
14160 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69  rated by an SQLi
14170 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e  te routine. If N
14180 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64  ULL is.** passed
14190 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
141a0 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d  n, we assume a m
141b0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64  alloc() failed d
141c0 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70  uring sqlite3_op
141d0 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
141e0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c  ite3_errcode(sql
141f0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
14200 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
14210 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
14220 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
14230 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
14240 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  SE_BKPT;.  }.  i
14250 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61  f( !db || db->ma
14260 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
14270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14280 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
14290 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
142a0 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61  Code & db->errMa
142b0 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  sk;.}.int sqlite
142c0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
142d0 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
142e0 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
142f0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
14300 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
14310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14320 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
14330 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
14340 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14350 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14360 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14370 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
14380 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 69 6e  b->errCode;.}.in
14390 74 20 73 71 6c 69 74 65 33 5f 73 79 73 74 65 6d  t sqlite3_system
143a0 5f 65 72 72 6e 6f 28 73 71 6c 69 74 65 33 20 2a  _errno(sqlite3 *
143b0 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
143c0 20 3f 20 64 62 2d 3e 69 53 79 73 45 72 72 6e 6f   ? db->iSysErrno
143d0 20 3a 20 30 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a   : 0;.}  ../*.**
143e0 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
143f0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
14400 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
14410 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
14420 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  he.** argument. 
14430 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73   For now, this s
14440 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20  imply calls the 
14450 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33  internal sqlite3
14460 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63  ErrStr().** func
14470 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
14480 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
14490 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72  str(int rc){.  r
144a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
144b0 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str(rc);.}../*.*
144c0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
144d0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
144e0 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22  n for database "
144f0 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69  db".  The name i
14500 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74  s zName.** and t
14510 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65  he encoding is e
14520 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nc..*/.static in
14530 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  t createCollatio
14540 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
14550 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
14560 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63  zName, .  u8 enc
14570 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a  ,.  void* pCtx,.
14580 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
14590 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
145a0 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
145b0 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
145c0 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
145d0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
145e0 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20  l;.  int enc2;. 
145f0 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
14600 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
14610 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
14620 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
14630 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
14640 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
14650 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
14660 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
14670 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
14680 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
14690 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
146a0 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
146b0 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
146c0 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
146d0 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
146e0 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d  y..  */.  enc2 =
146f0 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65   enc;.  testcase
14700 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
14710 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61  TF16 );.  testca
14720 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
14730 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
14740 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51  ;.  if( enc2==SQ
14750 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e  LITE_UTF16 || en
14760 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
14770 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20  _ALIGNED ){.    
14780 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54  enc2 = SQLITE_UT
14790 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20  F16NATIVE;.  }. 
147a0 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45   if( enc2<SQLITE
147b0 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51  _UTF8 || enc2>SQ
147c0 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a  LITE_UTF16BE ){.
147d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
147e0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
147f0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
14800 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72  f this call is r
14810 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61  emoving or repla
14820 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  cing an existing
14830 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a   collation .  **
14840 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f   sequence. If so
14850 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
14860 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75  active VMs, retu
14870 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72  rn busy. If ther
14880 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63  e.  ** are no ac
14890 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69  tive VMs, invali
148a0 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d  date any pre-com
148b0 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
148c0 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d  ..  */.  pColl =
148d0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
148e0 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
148f0 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , zName, 0);.  i
14900 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
14910 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69  l->xCmp ){.    i
14920 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
14930 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ve ){.      sqli
14940 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
14950 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
14960 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
14970 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
14980 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  fy collation seq
14990 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74  uence due to act
149a0 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
149b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
149c0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
149d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
149e0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
149f0 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 0a 20  ments(db, 0);.. 
14a00 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
14a10 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
14a20 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
14a30 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
14a40 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
14a50 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
14a60 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
14a70 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
14a80 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
14a90 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
14aa0 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
14ab0 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
14ac0 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
14ad0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
14ae0 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
14af0 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
14b00 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
14b10 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
14b20 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
14b30 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
14b40 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
14b50 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
14b60 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
14b70 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
14b80 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
14b90 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
14ba0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  zName);.      in
14bb0 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
14bc0 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
14bd0 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
14be0 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
14bf0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
14c00 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
14c10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
14c20 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
14c30 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
14c40 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
14c50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14c60 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
14c70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14c80 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
14c90 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
14ca0 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
14cb0 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
14cc0 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
14cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14ce0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 43 6f 6c  MEM_BKPT;.  pCol
14cf0 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61  l->xCmp = xCompa
14d00 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73  re;.  pColl->pUs
14d10 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f  er = pCtx;.  pCo
14d20 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b  ll->xDel = xDel;
14d30 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20  .  pColl->enc = 
14d40 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63  (u8)(enc2 | (enc
14d50 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f   & SQLITE_UTF16_
14d60 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c  ALIGNED));.  sql
14d70 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
14d80 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75  LITE_OK);.  retu
14d90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14da0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
14db0 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
14dc0 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
14dd0 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
14de0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
14df0 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
14e00 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
14e10 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
14e20 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
14e30 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
14e40 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
14e50 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
14e60 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
14e70 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
14e80 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
14e90 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
14ea0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
14eb0 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
14ec0 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
14ed0 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
14ee0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
14ef0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
14f00 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
14f10 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
14f20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
14f30 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
14f40 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
14f50 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20  ARIABLE_NUMBER, 
14f60 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
14f70 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20  8091-32352 */.  
14f80 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
14f90 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  ER_DEPTH,.  SQLI
14fa0 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
14fb0 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  READS,.};../*.**
14fc0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68   Make sure the h
14fd0 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73  ard limits are s
14fe0 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65  et to reasonable
14ff0 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53   values.*/.#if S
15000 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
15010 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
15020 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d  ITE_MAX_LENGTH m
15030 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
15040 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
15050 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
15060 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
15070 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
15080 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
15090 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
150a0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
150b0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c  X_SQL_LENGTH>SQL
150c0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
150d0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
150e0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
150f0 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72  t not be greater
15100 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58   than SQLITE_MAX
15110 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23  _LENGTH.#endif.#
15120 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
15130 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a  MPOUND_SELECT<2.
15140 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
15150 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
15160 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  CT must be at le
15170 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66  ast 2.#endif.#if
15180 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
15190 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53  _OP<40.# error S
151a0 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
151b0 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  P must be at lea
151c0 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66  st 40.#endif.#if
151d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
151e0 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51  TION_ARG<0 || SQ
151f0 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
15200 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65 72 72 6f  N_ARG>127.# erro
15210 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
15220 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
15230 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
15240 31 32 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  127.#endif.#if S
15250 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
15260 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
15270 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a  AX_ATTACHED>125.
15280 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
15290 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
152a0 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
152b0 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66  d 125.#endif.#if
152c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
152d0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c  _PATTERN_LENGTH<
152e0 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
152f0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
15300 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  N_LENGTH must be
15310 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
15320 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15330 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23  X_COLUMN>32767.#
15340 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
15350 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f  X_COLUMN must no
15360 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23  t exceed 32767.#
15370 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
15380 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
15390 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
153a0 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
153b0 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74  DEPTH must be at
153c0 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
153d0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
153e0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20  ORKER_THREADS<0 
153f0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  || SQLITE_MAX_WO
15400 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a  RKER_THREADS>50.
15410 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
15420 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
15430 53 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  S must be betwee
15440 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69  n 0 and 50.#endi
15450 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
15460 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
15470 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74  limit.  Report t
15480 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a  he old value..**
15490 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c   If an invalid l
154a0 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75  imit index is su
154b0 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d  pplied, report -
154c0 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  1..** Make no ch
154d0 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20  anges but still 
154e0 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  report the old v
154f0 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  alue if the.** n
15500 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  ew limit is nega
15510 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  tive..**.** A ne
15520 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f  w lower limit do
15530 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78  es not shrink ex
15540 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74  isting construct
15550 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  s..** It merely 
15560 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e  prevents new con
15570 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63  structs that exc
15580 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a  eed the limit.**
15590 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a   from forming..*
155a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  /.int sqlite3_li
155b0 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
155c0 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e   int limitId, in
155d0 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69  t newLimit){.  i
155e0 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69  nt oldLimit;..#i
155f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15600 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
15610 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
15620 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
15630 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
15640 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
15650 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
15660 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56  .#endif..  /* EV
15670 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31  IDENCE-OF: R-301
15680 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63  89-54097 For eac
15690 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79  h limit category
156a0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41   SQLITE_LIMIT_NA
156b0 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ME.  ** there is
156c0 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f   a hard upper bo
156d0 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69  und set at compi
156e0 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70  le-time by a C p
156f0 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a  reprocessor.  **
15700 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51   macro called SQ
15710 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28  LITE_MAX_NAME. (
15720 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e  The "_LIMIT_" in
15730 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61   the name is cha
15740 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d  nged to.  ** "_M
15750 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73  AX_".).  */.  as
15760 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
15770 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
15780 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
15790 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  X_LENGTH );.  as
157a0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
157b0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  [SQLITE_LIMIT_SQ
157c0 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  L_LENGTH]==SQLIT
157d0 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
157e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
157f0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15800 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53  LIMIT_COLUMN]==S
15810 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
15820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15830 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15840 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
15850 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  ]==SQLITE_MAX_EX
15860 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  PR_DEPTH );.  as
15870 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
15880 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
15890 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d  MPOUND_SELECT]==
158a0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
158b0 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61  UND_SELECT);.  a
158c0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
158d0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
158e0 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f  DBE_OP]==SQLITE_
158f0 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20  MAX_VDBE_OP );. 
15900 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
15910 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
15920 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d  _FUNCTION_ARG]==
15930 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
15940 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73  ION_ARG );.  ass
15950 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15960 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
15970 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ACHED]==SQLITE_M
15980 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20  AX_ATTACHED );. 
15990 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
159a0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
159b0 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
159c0 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20  NGTH]==.        
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
15a00 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
15a10 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
15a20 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
15a30 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
15a40 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c  BLE_NUMBER]==SQL
15a50 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
15a60 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65  _NUMBER);.  asse
15a70 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
15a80 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
15a90 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  GER_DEPTH]==SQLI
15aa0 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
15ab0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
15ac0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15ad0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
15ae0 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54  _THREADS]==SQLIT
15af0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
15b00 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74  EADS );.  assert
15b10 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  ( SQLITE_LIMIT_W
15b20 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28  ORKER_THREADS==(
15b30 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31  SQLITE_N_LIMIT-1
15b40 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d  ) );...  if( lim
15b50 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49  itId<0 || limitI
15b60 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  d>=SQLITE_N_LIMI
15b70 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
15b80 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d  -1;.  }.  oldLim
15b90 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  it = db->aLimit[
15ba0 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20  limitId];.  if( 
15bb0 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20  newLimit>=0 ){  
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36   /* IMP: R-52476
15be0 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66  -28732 */.    if
15bf0 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64  ( newLimit>aHard
15c00 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29  Limit[limitId] )
15c10 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74  {.      newLimit
15c20 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69   = aHardLimit[li
15c30 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a  mitId];  /* IMP:
15c40 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a   R-51463-25634 *
15c50 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  /.    }.    db->
15c60 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
15c70 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
15c80 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
15c90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
15ca0 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
15cb0 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a  -53341-35419 */.
15cc0 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  }.#if defined(SQ
15cd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f  LITE_ENABLE_AUTO
15ce0 5f 50 52 4f 46 49 4c 45 29 0a 2f 2a 20 73 74 64  _PROFILE)./* std
15cf0 65 72 72 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a 76  err logging */.v
15d00 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  oid _sqlite_auto
15d10 5f 70 72 6f 66 69 6c 65 28 76 6f 69 64 20 2a 61  _profile(void *a
15d20 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
15d30 73 71 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f  sql, u64 ns);.vo
15d40 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  id _sqlite_auto_
15d50 74 72 61 63 65 28 76 6f 69 64 20 2a 61 75 78 2c  trace(void *aux,
15d60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
15d70 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  );.void _sqlite_
15d80 61 75 74 6f 5f 70 72 6f 66 69 6c 65 28 76 6f 69  auto_profile(voi
15d90 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68  d *aux, const ch
15da0 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e 73 29  ar *sql, u64 ns)
15db0 20 7b 0a 23 70 72 61 67 6d 61 20 75 6e 75 73 65   {.#pragma unuse
15dc0 64 28 61 75 78 29 0a 09 66 70 72 69 6e 74 66 28  d(aux)..fprintf(
15dd0 73 74 64 65 72 72 2c 20 22 51 75 65 72 79 3a 20  stderr, "Query: 
15de0 25 73 5c 6e 20 45 78 65 63 75 74 69 6f 6e 20 54  %s\n Execution T
15df0 69 6d 65 3a 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c  ime: %llu ms\n",
15e00 20 73 71 6c 2c 20 6e 73 20 2f 20 31 30 30 30 30   sql, ns / 10000
15e10 30 30 29 3b 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c  00);.}.void _sql
15e20 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28 76  ite_auto_trace(v
15e30 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
15e40 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a 09 66 70  char *sql) {..fp
15e50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54  rintf(stderr, "T
15e60 72 61 63 65 53 51 4c 28 25 70 29 3a 20 25 73 5c  raceSQL(%p): %s\
15e70 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29 3b 0a 7d  n", aux, sql);.}
15e80 0a 0a 2f 2a 20 73 79 73 6c 6f 67 20 6c 6f 67 67  ../* syslog logg
15e90 69 6e 67 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ing */.#include 
15ea0 3c 61 73 6c 2e 68 3e 0a 73 74 61 74 69 63 20 61  <asl.h>.static a
15eb0 73 6c 63 6c 69 65 6e 74 20 61 75 74 6f 6c 6f 67  slclient autolog
15ec0 5f 63 6c 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a  _client = NULL;.
15ed0 73 74 61 74 69 63 20 76 6f 69 64 20 5f 63 6c 6f  static void _clo
15ee0 73 65 5f 61 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20  se_asl_log() {. 
15ef0 20 69 66 28 20 4e 55 4c 4c 21 3d 61 75 74 6f 6c   if( NULL!=autol
15f00 6f 67 5f 63 6c 69 65 6e 74 20 29 7b 0a 20 20 20  og_client ){.   
15f10 20 61 73 6c 5f 63 6c 6f 73 65 28 61 75 74 6f 6c   asl_close(autol
15f20 6f 67 5f 63 6c 69 65 6e 74 29 3b 0a 20 20 20 20  og_client);.    
15f30 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d  autolog_client =
15f40 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 73 74 61   NULL;.  }.}.sta
15f50 74 69 63 20 76 6f 69 64 20 5f 6f 70 65 6e 5f 61  tic void _open_a
15f60 73 6c 5f 6c 6f 67 28 29 20 7b 0a 20 20 69 66 28  sl_log() {.  if(
15f70 20 4e 55 4c 4c 3d 3d 61 75 74 6f 6c 6f 67 5f 63   NULL==autolog_c
15f80 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20 61 75 74  lient ){.    aut
15f90 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 3d 20 61 73  olog_client = as
15fa0 6c 5f 6f 70 65 6e 28 22 53 51 4c 69 74 65 22 2c  l_open("SQLite",
15fb0 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 61   NULL, 0);.    a
15fc0 74 65 78 69 74 28 5f 63 6c 6f 73 65 5f 61 73 6c  texit(_close_asl
15fd0 5f 6c 6f 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f  _log);.  }.}..vo
15fe0 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f  id _sqlite_auto_
15ff0 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 28 76  profile_syslog(v
16000 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20  oid *aux, const 
16010 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34 20 6e  char *sql, u64 n
16020 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65  s);.void _sqlite
16030 5f 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c  _auto_trace_sysl
16040 6f 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f  og(void *aux, co
16050 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 29 3b 0a  nst char *sql);.
16060 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74  void _sqlite_aut
16070 6f 5f 70 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67  o_profile_syslog
16080 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73  (void *aux, cons
16090 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34  t char *sql, u64
160a0 20 6e 73 29 20 7b 0a 23 70 72 61 67 6d 61 20 75   ns) {.#pragma u
160b0 6e 75 73 65 64 28 61 75 78 29 0a 09 61 73 6c 5f  nused(aux)..asl_
160c0 6c 6f 67 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65  log(autolog_clie
160d0 6e 74 2c 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45  nt, NULL, ASL_LE
160e0 56 45 4c 5f 4e 4f 54 49 43 45 2c 20 22 51 75 65  VEL_NOTICE, "Que
160f0 72 79 3a 20 25 73 5c 6e 20 45 78 65 63 75 74 69  ry: %s\n Executi
16100 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c 75 20 6d 73  on Time: %llu ms
16110 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73 20 2f 20 31  \n", sql, ns / 1
16120 30 30 30 30 30 30 29 3b 0a 7d 0a 76 6f 69 64 20  000000);.}.void 
16130 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61  _sqlite_auto_tra
16140 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a  ce_syslog(void *
16150 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  aux, const char 
16160 2a 73 71 6c 29 20 7b 0a 09 61 73 6c 5f 6c 6f 67  *sql) {..asl_log
16170 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 2c  (autolog_client,
16180 20 4e 55 4c 4c 2c 20 41 53 4c 5f 4c 45 56 45 4c   NULL, ASL_LEVEL
16190 5f 4e 4f 54 49 43 45 2c 20 22 54 72 61 63 65 53  _NOTICE, "TraceS
161a0 51 4c 28 25 70 29 3a 20 25 73 5c 6e 22 2c 20 61  QL(%p): %s\n", a
161b0 75 78 2c 20 73 71 6c 29 3b 0a 7d 0a 23 65 6e 64  ux, sql);.}.#end
161c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
161d0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
161e0 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52  to parse both UR
161f0 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66  Is and non-URI f
16200 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20  ilenames passed 
16210 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74  by the.** user t
16220 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20  o API functions 
16230 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f  sqlite3_open() o
16240 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
16250 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74  2(), and for dat
16260 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70  abase.** URIs sp
16270 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
16280 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d  of ATTACH statem
16290 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
162a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
162b0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
162c0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
162d0 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f  he VFS to use (o
162e0 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73  r.** a NULL to s
162f0 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75  ignify the defau
16300 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55  lt VFS) if the U
16310 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  RI does not cont
16320 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a  ain a "vfs=xxx".
16330 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
16340 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  er. The second a
16350 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
16360 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e   the URI (or non
16370 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a  -URI filename).*
16380 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74  * itself. When t
16390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
163a0 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61  called the *pFla
163b0 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  gs variable shou
163c0 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68  ld contain.** th
163d0 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20  e default flags 
163e0 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
163f0 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68  base handle with
16400 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72  . The value stor
16410 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73  ed in.** *pFlags
16420 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20   may be updated 
16430 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
16440 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65   if the URI file
16450 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a  name contains .*
16460 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72  * "cache=xxx" or
16470 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72   "mode=xxx" quer
16480 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a  y parameters..**
16490 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
164a0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
164b0 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
164c0 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73  s case *ppVfs is
164d0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
164e0 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74  .** the VFS that
164f0 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
16500 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
16510 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69  base file. *pzFi
16520 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  le is set to.** 
16530 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
16540 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
16550 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
16560 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73  e to open. It is
16570 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
16580 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
16590 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
165a0 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  lly call sqlite3
165b0 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
165c0 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
165d0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
165e0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
165f0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
16600 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
16610 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67  ed and *pzErrMsg
16620 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74  .** may be set t
16630 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
16640 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
16650 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
16660 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  ge error .** mes
16670 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
16680 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
16690 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
166a0 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
166b0 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
166c0 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  r by calling sql
166d0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
166e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65  int sqlite3Parse
166f0 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  Uri(.  const cha
16700 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20  r *zDefaultVfs, 
16710 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f         /* VFS to
16720 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d   use if no "vfs=
16730 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f  xxx" query optio
16740 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
16750 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20  r *zUri,        
16760 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
16770 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20  rminated URI to 
16780 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  parse */.  unsig
16790 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  ned int *pFlags,
167a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
167b0 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45  /OUT: SQLITE_OPE
167c0 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  N_XXX flags */. 
167d0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70   sqlite3_vfs **p
167e0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
167f0 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20   /* OUT: VFS to 
16800 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a  use */ .  char *
16810 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20  *pzFile,        
16820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16830 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f  : Filename compo
16840 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20  nent of URI */. 
16850 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
16880 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53  essage (if rc!=S
16890 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a  QLITE_OK) */.){.
168a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
168b0 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
168c0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46   int flags = *pF
168d0 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lags;.  const ch
168e0 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61  ar *zVfs = zDefa
168f0 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a  ultVfs;.  char *
16900 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b  zFile;.  char c;
16910 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71  .  int nUri = sq
16920 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
16930 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ri);..  assert( 
16940 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a  *pzErrMsg==0 );.
16950 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26  .  if( ((flags &
16960 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
16970 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  )             /*
16980 20 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33 32   IMP: R-48725-32
16990 32 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  206 */.         
169a0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f     || sqlite3Glo
169b0 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
169c0 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ri) /* IMP: R-51
169d0 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20  689-46548 */.   
169e0 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65  && nUri>=5 && me
169f0 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65  mcmp(zUri, "file
16a00 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50  :", 5)==0 /* IMP
16a10 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20  : R-57884-37496 
16a20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  */.  ){.    char
16a30 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20   *zOpt;.    int 
16a40 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
16a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
16a60 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70  ser state when p
16a70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20  arsing URI */.  
16a80 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20    int iIn;      
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74  /* Input charact
16ab0 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
16ac0 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ae0 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65   Output characte
16af0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75  r index */.    u
16b00 36 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b  64 nByte = nUri+
16b10 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
16b20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
16b30 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
16b40 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
16b50 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
16b60 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20  URI flag is set 
16b70 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74  to indicate to t
16b80 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20  he VFS xOpen .  
16b90 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74    ** method that
16ba0 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78   there may be ex
16bb0 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66  tra parameters f
16bc0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c  ollowing the fil
16bd0 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e-name.  */.    
16be0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
16bf0 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66  OPEN_URI;..    f
16c00 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55  or(iIn=0; iIn<nU
16c10 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65  ri; iIn++) nByte
16c20 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d   += (zUri[iIn]==
16c30 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  '&');.    zFile 
16c40 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
16c50 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  64(nByte);.    i
16c60 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
16c70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
16c80 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49 6e 20 3d  BKPT;..    iIn =
16c90 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   5;.#ifdef SQLIT
16ca0 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48  E_ALLOW_URI_AUTH
16cb0 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20 73 74  ORITY.    if( st
16cc0 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f  rncmp(zUri+5, "/
16cd0 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  //", 3)==0 ){.  
16ce0 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
16cf0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
16d00 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61  ing condition ca
16d10 75 73 65 73 20 55 52 49 73 20 77 69 74 68 20 66  uses URIs with f
16d20 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68  ive leading / ch
16d30 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a  aracters.      *
16d40 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f  * like file:////
16d50 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65  /host/path to be
16d60 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
16d70 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74  UNCs like //host
16d80 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  /path..      ** 
16d90 54 68 65 20 63 6f 72 72 65 63 74 20 55 52 49 20  The correct URI 
16da0 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61 73  for that UNC has
16db0 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75   only two or fou
16dc0 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72  r leading / char
16dd0 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  acters.      ** 
16de0 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68  file://host/path
16df0 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73   or file:////hos
16e00 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c  t/path.  But 5 l
16e10 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69  eading slashes i
16e20 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  s a .      ** co
16e30 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61  mmon error, we a
16e40 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68  re told, so we h
16e50 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73 70  andle it as a sp
16e60 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20  ecial case. */. 
16e70 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
16e80 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20  (zUri+7, "///", 
16e90 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20  3)==0 ){ iIn++; 
16ea0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
16eb0 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20  strncmp(zUri+5, 
16ec0 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20  "//localhost/", 
16ed0 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  12)==0 ){.      
16ee0 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a  iIn = 16;.    }.
16ef0 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69 73  #else.    /* Dis
16f00 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
16f10 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
16f20 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
16f30 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
16f40 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
16f50 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
16f60 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
16f70 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
16f80 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
16f90 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='/' ) iIn++;. 
16fa0 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
16fb0 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
16fc0 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
16fd0 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
16fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
16ff0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17000 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
17010 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
17020 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
17030 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
17040 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
17050 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
17060 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
17070 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
17080 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
17090 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  f..    /* Copy t
170a0 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
170b0 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65  any query parame
170c0 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46  ters into the zF
170d0 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20  ile buffer. .   
170e0 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65   ** Decode %HH e
170f0 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e  scape codes alon
17100 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20  g the way. .    
17110 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e  **.    ** Within
17120 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69   this loop, vari
17130 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20  able eState may 
17140 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f  be set to 0, 1 o
17150 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20  r 2, depending. 
17160 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72     ** on the par
17170 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73  sing context. As
17180 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
17190 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72  .    **   0: Par
171a0 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a  sing file-name..
171b0 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73      **   1: Pars
171c0 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e  ing name section
171d0 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
171e0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
171f0 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61  ..    **   2: Pa
17200 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74  rsing value sect
17210 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
17220 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
17230 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ter..    */.    
17240 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
17250 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
17260 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
17270 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '#' ){.      iIn
17280 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
17290 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20  ='%' .       && 
172a0 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
172b0 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20  zUri[iIn]) .    
172c0 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
172d0 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31  digit(zUri[iIn+1
172e0 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ]) .      ){.   
172f0 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d       int octet =
17300 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e   (sqlite3HexToIn
17310 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c  t(zUri[iIn++]) <
17320 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63  < 4);.        oc
17330 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65  tet += sqlite3He
17340 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
17350 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  +]);..        as
17360 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26  sert( octet>=0 &
17370 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20  & octet<256 );. 
17380 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74         if( octet
17390 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
173a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 52 49  QLITE_ENABLE_URI
173b0 5f 30 30 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  _00_ERROR.      
173c0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
173d0 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
173e0 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
173f0 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
17400 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
17410 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
17420 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
17430 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
17440 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
17450 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
17460 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
17470 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
17480 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
17490 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
174a0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
174b0 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
174c0 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
174d0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
174e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
174f0 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
17500 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
17510 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17520 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
17530 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
17540 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
17550 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
17560 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
17570 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
17580 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
17590 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
175a0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
175b0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
175c0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
175d0 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  e;.#else.       
175e0 20 20 20 2f 2a 20 49 66 20 45 4e 41 42 4c 45 5f     /* If ENABLE_
175f0 55 52 49 5f 30 30 5f 45 52 52 4f 52 20 69 73 20  URI_00_ERROR is 
17600 64 65 66 69 6e 65 64 2c 20 22 25 30 30 22 20 69  defined, "%00" i
17610 6e 20 61 20 55 52 49 20 69 73 20 61 6e 20 65 72  n a URI is an er
17620 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ror. */.        
17630 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
17640 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75  lite3_mprintf("u
17650 6e 65 78 70 65 63 74 65 64 20 25 25 30 30 20 69  nexpected %%00 i
17660 6e 20 75 72 69 22 29 3b 0a 20 20 20 20 20 20 20  n uri");.       
17670 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
17680 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
17690 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
176a0 75 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ut;.#endif.     
176b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
176c0 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65   octet;.      }e
176d0 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d  lse if( eState==
176e0 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20  1 && (c=='&' || 
176f0 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  c=='=') ){.     
17700 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75     if( zFile[iOu
17710 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1]==0 ){.     
17720 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79       /* An empty
17730 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67   option name. Ig
17740 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
17750 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a   altogether. */.
17760 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
17770 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
17780 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20  ri[iIn]!='#' && 
17790 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27  zUri[iIn-1]!='&'
177a0 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
177b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
177c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
177d0 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20  if( c=='&' ){.  
177e0 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f          zFile[iO
177f0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
17800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17810 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
17820 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
17830 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
17840 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74    }else if( (eSt
17850 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27  ate==0 && c=='?'
17860 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20  ) || (eState==2 
17870 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20  && c=='&') ){.  
17880 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
17890 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b       eState = 1;
178a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
178b0 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63  File[iOut++] = c
178c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
178d0 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c  eState==1 ) zFil
178e0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
178f0 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
17900 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
17910 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
17920 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  '\0';..    /* Ch
17930 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72  eck if there wer
17940 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70  e any options sp
17950 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f  ecified that sho
17960 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74  uld be interpret
17970 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e  ed .    ** here.
17980 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72   Options that ar
17990 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65  e interpreted he
179a0 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22  re include "vfs"
179b0 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a   and those that.
179c0 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
179d0 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20  d to flags that 
179e0 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f  may be passed to
179f0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65   the sqlite3_ope
17a00 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65  n_v2().    ** me
17a10 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70  thod. */.    zOp
17a20 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74  t = &zFile[sqlit
17a30 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
17a40 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
17a50 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20   zOpt[0] ){.    
17a60 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c    int nOpt = sql
17a70 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
17a80 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t);.      char *
17a90 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70  zVal = &zOpt[nOp
17aa0 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  t+1];.      int 
17ab0 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nVal = sqlite3St
17ac0 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20  rlen30(zVal);.. 
17ad0 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33       if( nOpt==3
17ae0 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22   && memcmp("vfs"
17af0 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b  , zOpt, 3)==0 ){
17b00 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20  .        zVfs = 
17b10 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  zVal;.      }els
17b20 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
17b30 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20  t OpenMode {.   
17b40 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
17b50 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  r *z;.          
17b60 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  int mode;.      
17b70 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a    } *aMode = 0;.
17b80 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
17b90 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20  odeType = 0;.   
17ba0 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
17bb0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
17bc0 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  imit = 0;..     
17bd0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26     if( nOpt==5 &
17be0 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22  & memcmp("cache"
17bf0 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b  , zOpt, 5)==0 ){
17c00 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
17c10 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
17c20 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d  e aCacheMode[] =
17c30 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
17c40 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49   "shared",  SQLI
17c50 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
17c60 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
17c70 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20     { "private", 
17c80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
17c90 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
17ca0 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
17cb0 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
17cc0 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
17cd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
17ce0 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f  EDCACHE|SQLITE_O
17cf0 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
17d00 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
17d10 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a  e = aCacheMode;.
17d20 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
17d30 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  = mask;.        
17d40 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63    zModeType = "c
17d50 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d  ache";.        }
17d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
17d70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==4 && memcmp("
17d80 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d  mode", zOpt, 4)=
17d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17da0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
17db0 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65  enMode aOpenMode
17dc0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
17dd0 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49     { "ro",  SQLI
17de0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
17df0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
17e00 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f  { "rw",  SQLITE_
17e10 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d  OPEN_READWRITE }
17e20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  , .            {
17e30 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f   "rwc", SQLITE_O
17e40 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
17e50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
17e60 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  TE },.          
17e70 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51    { "memory", SQ
17e80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
17e90 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
17ea0 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
17eb0 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
17ec0 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
17ed0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53  PEN_READONLY | S
17ee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17ef0 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
17f00 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
17f10 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
17f20 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
17f30 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  Y;.          aMo
17f40 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a  de = aOpenMode;.
17f50 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
17f60 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a  = mask & flags;.
17f70 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
17f80 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a  ype = "access";.
17f90 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17fa0 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a     if( aMode ){.
17fb0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
17fc0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
17fd0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
17fe0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64     for(i=0; aMod
17ff0 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20  e[i].z; i++){.  
18000 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
18010 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b  char *z = aMode[
18020 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  i].z;.          
18030 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69    if( nVal==sqli
18040 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26  te3Strlen30(z) &
18050 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c  & 0==memcmp(zVal
18060 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20  , z, nVal) ){.  
18070 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
18080 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65   = aMode[i].mode
18090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
180a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
180b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
180c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
180d0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
180e0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
180f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18100 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f  f("no such %s mo
18110 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79  de: %s", zModeTy
18120 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
18130 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18140 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
18150 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
18160 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
18170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18180 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c  if( (mode & ~SQL
18190 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
181a0 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
181b0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
181c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
181d0 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61  f("%s mode not a
181e0 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20  llowed: %s",.   
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20       zModeType, 
18220 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
18230 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
18240 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERM;.           
18250 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
18260 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
18270 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
18280 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73   = (flags & ~mas
18290 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20  k) | mode;.     
182a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
182b0 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c      zOpt = &zVal
182c0 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a  [nVal+1];.    }.
182d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46  .  }else{.    zF
182e0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
182f0 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b 0a  lloc64(nUri+2);.
18300 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
18310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
18320 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 69  OMEM_BKPT;.    i
18330 66 28 20 6e 55 72 69 20 29 7b 0a 20 20 20 20 20  f( nUri ){.     
18340 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a   memcpy(zFile, z
18350 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
18360 7d 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  }.    zFile[nUri
18370 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
18380 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c  ile[nUri+1] = '\
18390 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  0';.    flags &=
183a0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
183b0 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73  I;.  }..  *ppVfs
183c0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
183d0 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
183e0 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20   *ppVfs==0 ){.  
183f0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
18400 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
18410 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
18420 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d   zVfs);.    rc =
18430 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
18440 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75   }. parse_uri_ou
18450 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
18460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
18470 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
18480 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30  );.    zFile = 0
18490 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20  ;.  }.  *pFlags 
184a0 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69  = flags;.  *pzFi
184b0 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65  le = zFile;.  re
184c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
184d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
184e0 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
184f0 4c 45 29 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  LE).#define SQLI
18500 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
18510 54 44 45 52 52 20 31 0a 23 64 65 66 69 6e 65 20  TDERR 1.#define 
18520 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
18530 4e 47 5f 53 59 53 4c 4f 47 20 32 0a 73 74 61 74  NG_SYSLOG 2.stat
18540 69 63 20 76 6f 69 64 20 65 6e 61 62 6c 65 41 75  ic void enableAu
18550 74 6f 4c 6f 67 67 69 6e 67 28 0a 20 20 73 71 6c  toLogging(.  sql
18560 69 74 65 33 20 2a 64 62 0a 29 7b 0a 20 20 63 68  ite3 *db.){.  ch
18570 61 72 20 2a 65 6e 76 70 72 6f 66 69 6c 65 20 3d  ar *envprofile =
18580 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
18590 41 55 54 4f 5f 50 52 4f 46 49 4c 45 22 29 3b 0a  AUTO_PROFILE");.
185a0 20 20 0a 20 20 69 66 28 20 65 6e 76 70 72 6f 66    .  if( envprof
185b0 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ile!=NULL ){.   
185c0 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b 0a   int where = 0;.
185d0 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61 73      if( !strncas
185e0 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 70 72 6f  ecmp("1", envpro
185f0 66 69 6c 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  file, 1) ){.    
18600 20 20 69 66 28 20 69 73 61 74 74 79 28 32 29 20    if( isatty(2) 
18610 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ){.        where
18620 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f   = SQLITE_AUTOLO
18630 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20  GGING_STDERR;.  
18640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18650 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
18660 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
18670 53 4c 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SLOG;.      }.  
18680 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74    } else if( !st
18690 72 6e 63 61 73 65 63 6d 70 28 22 73 74 64 65 72  rncasecmp("stder
186a0 72 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20  r", envprofile, 
186b0 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72  6) ){.      wher
186c0 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  e = SQLITE_AUTOL
186d0 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20  OGGING_STDERR;. 
186e0 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73     } else if( !s
186f0 74 72 6e 63 61 73 65 63 6d 70 28 22 73 79 73 6c  trncasecmp("sysl
18700 6f 67 22 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c  og", envprofile,
18710 20 36 29 20 29 7b 0a 20 20 20 20 20 20 77 68 65   6) ){.      whe
18720 72 65 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f  re = SQLITE_AUTO
18730 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a  LOGGING_SYSLOG;.
18740 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 68      }.    if( wh
18750 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f  ere==SQLITE_AUTO
18760 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 29  LOGGING_STDERR )
18770 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
18780 70 72 6f 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c  profile(db, _sql
18790 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65  ite_auto_profile
187a0 2c 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , db);.    }else
187b0 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49   if( where==SQLI
187c0 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
187d0 59 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f  YSLOG ){.      _
187e0 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a  open_asl_log();.
187f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
18800 6f 66 69 6c 65 28 64 62 2c 20 5f 73 71 6c 69 74  ofile(db, _sqlit
18810 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f 73  e_auto_profile_s
18820 79 73 6c 6f 67 2c 20 64 62 29 3b 0a 20 20 20 20  yslog, db);.    
18830 7d 0a 20 20 7d 0a 20 20 63 68 61 72 20 2a 65 6e  }.  }.  char *en
18840 76 74 72 61 63 65 20 3d 20 67 65 74 65 6e 76 28  vtrace = getenv(
18850 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 54 52 41  "SQLITE_AUTO_TRA
18860 43 45 22 29 3b 0a 20 20 69 66 28 20 65 6e 76 74  CE");.  if( envt
18870 72 61 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  race!=NULL ){.  
18880 20 20 69 6e 74 20 77 68 65 72 65 20 3d 20 30 3b    int where = 0;
18890 0a 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 61  .    if( !strnca
188a0 73 65 63 6d 70 28 22 31 22 2c 20 65 6e 76 74 72  secmp("1", envtr
188b0 61 63 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  ace, 1) ){.     
188c0 20 69 66 28 20 69 73 61 74 74 79 28 32 29 20 29   if( isatty(2) )
188d0 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20  {.        where 
188e0 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47  = SQLITE_AUTOLOG
188f0 47 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20  GING_STDERR;.   
18900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18910 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
18920 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53  _AUTOLOGGING_SYS
18930 4c 4f 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LOG;.      }.   
18940 20 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72   } else if( !str
18950 6e 63 61 73 65 63 6d 70 28 22 73 74 64 65 72 72  ncasecmp("stderr
18960 22 2c 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20  ", envtrace, 6) 
18970 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d  ){.      where =
18980 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47   SQLITE_AUTOLOGG
18990 49 4e 47 5f 53 54 44 45 52 52 3b 0a 20 20 20 20  ING_STDERR;.    
189a0 7d 20 65 6c 73 65 20 69 66 28 20 21 73 74 72 6e  } else if( !strn
189b0 63 61 73 65 63 6d 70 28 22 73 79 73 6c 6f 67 22  casecmp("syslog"
189c0 2c 20 65 6e 76 74 72 61 63 65 2c 20 36 29 20 29  , envtrace, 6) )
189d0 7b 0a 20 20 20 20 20 20 77 68 65 72 65 20 3d 20  {.      where = 
189e0 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
189f0 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d  NG_SYSLOG;.    }
18a00 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 3d 3d  .    if( where==
18a10 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49  SQLITE_AUTOLOGGI
18a20 4e 47 5f 53 54 44 45 52 52 20 29 7b 0a 20 20 20  NG_STDERR ){.   
18a30 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
18a40 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74  (db, _sqlite_aut
18a50 6f 5f 74 72 61 63 65 2c 20 64 62 29 3b 0a 20 20  o_trace, db);.  
18a60 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
18a70 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f  e==SQLITE_AUTOLO
18a80 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20 29 7b 0a  GGING_SYSLOG ){.
18a90 20 20 20 20 20 20 5f 6f 70 65 6e 5f 61 73 6c 5f        _open_asl_
18aa0 6c 6f 67 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  log();.      sql
18ab0 69 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f  ite3_trace(db, _
18ac0 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63  sqlite_auto_trac
18ad0 65 5f 73 79 73 6c 6f 67 2c 20 64 62 29 3b 0a 20  e_syslog, db);. 
18ae0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
18af0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
18b00 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
18b10 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
18b20 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
18b30 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
18b40 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
18b50 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
18b60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18b70 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
18b80 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
18b90 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
18ba0 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
18bb0 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
18bc0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
18bd0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
18be0 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
18bf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
18c00 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
18c10 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
18c20 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
18c30 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
18c40 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
18c50 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
18c60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18c70 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
18c80 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
18c90 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
18ca0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18cc0 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
18cd0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
18ce0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
18d10 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
18d20 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
18d30 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
18d40 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
18d50 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
18d60 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
18d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18d80 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
18d90 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
18da0 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
18db0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18dd0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
18de0 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
18df0 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ri() */..#ifdef 
18e00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
18e10 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
18e20 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
18e30 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
18e40 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
18e50 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
18e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
18e70 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
18e80 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
18e90 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
18ea0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
18eb0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
18ec0 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
18ed0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
18ee0 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
18ef0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
18f00 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
18f10 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
18f20 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
18f30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
18f40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
18f50 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
18f60 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
18f70 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
18f80 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
18f90 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18fa0 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
18fb0 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67 73    }..  if( flags
18fc0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
18fd0 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
18fe0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
18ff0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
19000 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
19010 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
19020 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
19030 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
19040 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
19050 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
19060 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
19070 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
19080 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
19090 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
190a0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
190b0 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
190c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
190d0 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
190e0 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
190f0 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
19100 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
19110 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
19120 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
19130 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
19140 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
19150 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
19160 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
19170 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
19180 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f  DWRITE, SQLITE_O
19190 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49  PEN_CREATE, SQLI
191a0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
191b0 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  CHE,.  ** SQLITE
191c0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
191d0 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73  HE, and some res
191e0 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c  erved bits.  Sil
191f0 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
19200 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
19210 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
19220 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
19230 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
19240 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
19250 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
19260 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
19270 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
19280 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
19290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
192a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
192b0 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
192c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
192d0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
192e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
192f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
19300 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
19310 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
19320 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
19330 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
19340 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
19350 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
19360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19370 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
19380 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
19390 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
193a0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
193b0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
193c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
193d0 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
193e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
193f0 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
19400 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
19410 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
19420 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
19430 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
19440 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
19450 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
19460 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
19470 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
19480 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
19490 66 65 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  fe .#ifdef SQLIT
194a0 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 54 48  E_ENABLE_MULTITH
194b0 52 45 41 44 45 44 5f 43 48 45 43 4b 53 0a 20 20  READED_CHECKS.  
194c0 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
194d0 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
194e0 65 78 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  ex.#endif.  ){. 
194f0 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73     db->mutex = s
19500 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
19510 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
19520 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66  CURSIVE);.    if
19530 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  ( db->mutex==0 )
19540 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
19550 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20  free(db);.      
19560 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  db = 0;.      go
19570 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
19580 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 54     }.    if( isT
19590 68 72 65 61 64 73 61 66 65 3d 3d 30 20 29 7b 0a  hreadsafe==0 ){.
195a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74        sqlite3Mut
195b0 65 78 57 61 72 6e 4f 6e 43 6f 6e 74 65 6e 74 69  exWarnOnContenti
195c0 6f 6e 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  on(db->mutex);. 
195d0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
195e0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
195f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
19600 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b  >errMask = 0xff;
19610 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
19620 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
19630 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
19640 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
19650 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 64 62  >aDbStatic;.  db
19660 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
19670 61 62 6c 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73  able = 1;..  ass
19680 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
19690 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
196a0 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
196b0 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
196c0 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
196d0 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
196e0 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69  t));.  db->aLimi
196f0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
19700 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d  ORKER_THREADS] =
19710 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
19720 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a  WORKER_THREADS;.
19730 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
19740 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
19750 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
19760 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c  db->szMmap = sql
19770 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19780 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e  .szMmap;.  db->n
19790 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
197a0 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65  .  db->nMaxSorte
197b0 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46  rMmap = 0x7FFFFF
197c0 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  FF;.  db->flags 
197d0 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
197e0 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
197f0 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c  _EnableTrigger |
19800 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
19810 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ll.#if !defined(
19820 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
19830 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20  UTOMATIC_INDEX) 
19840 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  || SQLITE_DEFAUL
19850 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
19860 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X.              
19870 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f     | SQLITE_Auto
19880 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66  Index.#endif.#if
19890 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
198a0 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20  CKPTFULLFSYNC.  
198b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
198c0 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c   SQLITE_CkptFull
198d0 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66  FSync.#endif.#if
198e0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
198f0 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20  FILE_FORMAT<4.  
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
19910 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
19920 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66  leFmt.#endif.#if
19930 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19940 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
19950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19960 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45    | SQLITE_LoadE
19970 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a  xtension.#endif.
19980 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
19990 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49  LT_RECURSIVE_TRI
199a0 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20  GGERS.          
199b0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
199c0 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64  RecTriggers.#end
199d0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
199e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
199f0 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53  REIGN_KEYS) && S
19a00 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
19a10 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20  REIGN_KEYS.     
19a20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19a30 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
19a40 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
19a50 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52  ned(SQLITE_REVER
19a60 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c  SE_UNORDERED_SEL
19a70 45 43 54 53 29 0a 20 20 20 20 20 20 20 20 20 20  ECTS).          
19a80 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
19a90 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e  ReverseOrder.#en
19aa0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
19ab0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
19ac0 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
19ad0 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K).             
19ae0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c      | SQLITE_Cel
19af0 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 23  lSizeCk.#endif.#
19b00 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19b10 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  E_ENABLE_FTS3_TO
19b20 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20 20 20 20  KENIZER).       
19b30 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
19b40 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
19b50 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
19b60 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
19b70 45 5f 51 50 53 47 29 0a 20 20 20 20 20 20 20 20  E_QPSG).        
19b80 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
19b90 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a 23 65 6e  E_EnableQPSG.#en
19ba0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
19bb0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 44  SQLITE_DEFAULT_D
19bc0 45 46 45 4e 53 49 56 45 29 0a 20 20 20 20 20 20  EFENSIVE).      
19bd0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
19be0 49 54 45 5f 44 65 66 65 6e 73 69 76 65 0a 23 65  ITE_Defensive.#e
19bf0 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
19c00 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
19c10 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
19c20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19c30 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
19c40 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
19c50 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
19c60 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
19c70 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
19c80 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19c90 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
19ca0 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
19cb0 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
19cc0 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
19cd0 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
19ce0 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
19cf0 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
19d00 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
19d10 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
19d20 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
19d30 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
19d40 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ure..  **.  ** E
19d50 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32  VIDENCE-OF: R-52
19d60 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65  786-44878 SQLite
19d70 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62   defines three b
19d80 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
19d90 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  g.  ** functions
19da0 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  :.  */.  createC
19db0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c  ollation(db, sql
19dc0 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53  ite3StrBINARY, S
19dd0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62  QLITE_UTF8, 0, b
19de0 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
19df0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
19e00 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72  n(db, sqlite3Str
19e10 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55  BINARY, SQLITE_U
19e20 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16BE, 0, binCo
19e30 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
19e40 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
19e50 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  , sqlite3StrBINA
19e60 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  RY, SQLITE_UTF16
19e70 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  LE, 0, binCollFu
19e80 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
19e90 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e  Collation(db, "N
19ea0 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55  OCASE", SQLITE_U
19eb0 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f  TF8, 0, nocaseCo
19ec0 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b  llatingFunc, 0);
19ed0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
19ee0 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20  on(db, "RTRIM", 
19ef0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
19f00 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75  id*)1, binCollFu
19f10 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
19f20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19f30 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
19f40 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20  b_out;.  }.  /* 
19f50 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
19f60 38 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64  8308-17224 The d
19f70 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
19f80 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c   function for al
19f90 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69  l.  ** strings i
19fa0 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a  s BINARY. .  */.
19fb0 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
19fc0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
19fd0 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
19fe0 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72  UTF8, sqlite3Str
19ff0 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73  BINARY, 0);.  as
1a000 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43  sert( db->pDfltC
1a010 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  oll!=0 );..  /* 
1a020 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61  Parse the filena
1a030 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 0a  me/URI argument.
1a040 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20 61    **.  ** Only a
1a050 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f  llow sensible co
1a060 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69  mbinations of bi
1a070 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  ts in the flags 
1a080 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a  argument.  .  **
1a090 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
1a0a0 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65  if any non-sense
1a0b0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20   combination is 
1a0c0 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a  used.  If we.  *
1a0d0 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69  * do not block i
1a0e0 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69  llegal combinati
1a0f0 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75  ons here, it cou
1a100 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20  ld trigger.  ** 
1a110 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1a120 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61  nts in deeper la
1a130 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20  yers.  Sensible 
1a140 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a  combinations.  *
1a150 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  * are:.  **.  **
1a160 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    1:  SQLITE_OPE
1a170 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  N_READONLY.  ** 
1a180 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   2:  SQLITE_OPEN
1a190 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20  _READWRITE.  ** 
1a1a0 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   6:  SQLITE_OPEN
1a1b0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
1a1c0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
1a1d0 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46    */.  db->openF
1a1e0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
1a1f0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
1a200 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d  PEN_READONLY  ==
1a210 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72   0x01 );.  asser
1a220 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
1a230 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32  EADWRITE == 0x02
1a240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
1a250 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1a260 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20      == 0x04 );. 
1a270 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
1a280 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20  flags&7))==0x02 
1a290 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a  ); /* READONLY *
1a2a0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
1a2b0 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
1a2c0 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  04 ); /* READWRI
1a2d0 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  TE */.  testcase
1a2e0 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
1a2f0 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41  ==0x40 ); /* REA
1a300 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
1a310 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66  */.  if( ((1<<(f
1a320 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29  lags&7)) & 0x46)
1a330 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1a340 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1a350 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36  PT;  /* IMP: R-6
1a360 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20  5497-44594 */.  
1a370 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1a380 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
1a390 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  zVfs, zFilename,
1a3a0 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56   &flags, &db->pV
1a3b0 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72  fs, &zOpen, &zEr
1a3c0 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rMsg);.  }.  if(
1a3d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a3e0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
1a3f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c  LITE_NOMEM ) sql
1a400 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
1a410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
1a420 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
1a430 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  , zErrMsg ? "%s"
1a440 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a   : 0, zErrMsg);.
1a450 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a460 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67  (zErrMsg);.    g
1a470 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
1a480 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
1a490 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62  he backend datab
1a4a0 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20  ase driver */.  
1a4b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1a4c0 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
1a4d0 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e  zOpen, db, &db->
1a4e0 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20  aDb[0].pBt, 0,. 
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a500 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53         flags | S
1a510 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1a520 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  DB);.  if( rc!=S
1a530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a540 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1a550 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
1a560 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a570 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
1a580 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
1a590 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20  or(db, rc);.    
1a5a0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
1a5b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1a5c0 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62  reeEnter(db->aDb
1a5d0 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
1a5e0 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
1a5f0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
1a600 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
1a610 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62  .pBt);.  if( !db
1a620 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a630 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d   ENC(db) = SCHEM
1a640 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c  A_ENC(db);.  sql
1a650 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 64  ite3BtreeLeave(d
1a660 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
1a670 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63    db->aDb[1].pSc
1a680 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
1a690 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a  hemaGet(db, 0);.
1a6a0 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
1a6b0 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  t safety_level f
1a6c0 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
1a6d0 62 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f  base is FULL; fo
1a6e0 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20  r the temp.  ** 
1a6f0 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20 4f  database it is O
1a700 46 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  FF. This matches
1a710 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1a720 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a   defaults.  .  *
1a730 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a  /.  db->aDb[0].z
1a740 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22  DbSName = "main"
1a750 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  ;.  db->aDb[0].s
1a760 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51  afety_level = SQ
1a770 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
1a780 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64 62  CHRONOUS+1;.  db
1a790 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[1].zDbSNam
1a7a0 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62  e = "temp";.  db
1a7b0 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f  ->aDb[1].safety_
1a7c0 6c 65 76 65 6c 20 3d 20 50 41 47 45 52 5f 53 59  level = PAGER_SY
1a7d0 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a  NCHRONOUS_OFF;..
1a7e0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1a7f0 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
1a800 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1a810 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1a820 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
1a830 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
1a840 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20  er all built-in 
1a850 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64  functions, but d
1a860 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
1a870 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64   read the.  ** d
1a880 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79  atabase schema y
1a890 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61  et. This is dela
1a8a0 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  yed until the fi
1a8b0 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74  rst time the dat
1a8c0 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63  abase.  ** is ac
1a8d0 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  cessed..  */.  s
1a8e0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
1a8f0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
1a900 6c 69 74 65 33 52 65 67 69 73 74 65 72 50 65 72  lite3RegisterPer
1a910 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69  ConnectionBuilti
1a920 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  nFunctions(db);.
1a930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
1a940 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23 69 66  rrcode(db);..#if
1a950 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a960 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65 67 69  E_FTS5.  /* Regi
1a970 73 74 65 72 20 61 6e 79 20 62 75 69 6c 74 2d 69  ster any built-i
1a980 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 62 65  n FTS5 module be
1a990 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74 68 65  fore loading the
1a9a0 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a 2a 20   automatic.  ** 
1a9b0 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68 69 73  extensions. This
1a9c0 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61 74 69   allows automati
1a9d0 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f 20  c extensions to 
1a9e0 72 65 67 69 73 74 65 72 20 46 54 53 35 20 0a 20  register FTS5 . 
1a9f0 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73 20 61   ** tokenizers a
1aa00 6e 64 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e  nd auxiliary fun
1aa10 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69 66  ctions.  */.  if
1aa20 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1aa30 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1aa40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1aa50 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74   sqlite3Fts5Init
1aa60 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1aa70 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
1aa80 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
1aa90 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
1aaa0 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
1aab0 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
1aac0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
1aad0 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
1aae0 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
1aaf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ab00 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1ab10 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69  3AutoLoadExtensi
1ab20 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20  ons(db);.    rc 
1ab30 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
1ab40 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  e(db);.    if( r
1ab50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ab60 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
1ab70 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
1ab80 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ab90 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66  ENABLE_FTS1.  if
1aba0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1abb0 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72  led ){.    exter
1abc0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
1abd0 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  1Init(sqlite3*);
1abe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1abf0 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts1Init(db);. 
1ac00 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
1ac10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ac20 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS2.  if( !db->
1ac30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
1ac40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ac50 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1ac60 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
1ac70 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
1ac80 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49  c = sqlite3Fts2I
1ac90 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1aca0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1acb0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f  TE_ENABLE_FTS3 /
1acc0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1acd0 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49 54  defined by SQLIT
1ace0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f  E_ENABLE_FTS4 */
1acf0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
1ad00 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
1ad10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ad20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
1ad30 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  3Init(db);.  }.#
1ad40 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1ad50 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1ad60 5f 49 43 55 29 20 7c 7c 20 64 65 66 69 6e 65 64  _ICU) || defined
1ad70 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1ad80 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 20  CU_COLLATIONS). 
1ad90 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1ada0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1adb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1adc0 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e  c = sqlite3IcuIn
1add0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
1ade0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1adf0 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20  E_ENABLE_RTREE. 
1ae00 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1ae10 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1ae20 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
1ae30 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49   = sqlite3RtreeI
1ae40 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1ae50 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1ae60 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45  TE_ENABLE_DBPAGE
1ae70 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d  _VTAB.  if( !db-
1ae80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1ae90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
1aea0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1aeb0 33 44 62 70 61 67 65 52 65 67 69 73 74 65 72 28  3DbpageRegister(
1aec0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1aed0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1aee0 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41  NABLE_DBSTAT_VTA
1aef0 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  B.  if( !db->mal
1af00 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1af10 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
1af20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73   rc = sqlite3Dbs
1af30 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b  tatRegister(db);
1af40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1af50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1af60 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64  E_JSON1.  if( !d
1af70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1af80 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1af90 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1afa0 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29  te3Json1Init(db)
1afb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1afc0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1afd0 4c 45 5f 53 54 4d 54 56 54 41 42 0a 20 20 69 66  LE_STMTVTAB.  if
1afe0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1aff0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1b000 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
1b010 73 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49  sqlite3StmtVtabI
1b020 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1b030 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49  dif..  /* -DSQLI
1b040 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
1b050 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20  NG_MODE=1 makes 
1b060 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65  EXCLUSIVE the de
1b070 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
1b080 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49  ** mode.  -DSQLI
1b090 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
1b0a0 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e  NG_MODE=0 make N
1b0b0 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
1b0c0 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
1b0d0 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68  ode.  Doing noth
1b0e0 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20  ing at all also 
1b0f0 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65  makes NORMAL the
1b100 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23   default..  */.#
1b110 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
1b120 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
1b130 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b  E.  db->dfltLock
1b140 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
1b150 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
1b160 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  DE;.  sqlite3Pag
1b170 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71  erLockingMode(sq
1b180 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1b190 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c  db->aDb[0].pBt),
1b1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b1b0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1b1c0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
1b1d0 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a  G_MODE);.#endif.
1b1e0 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69  .  if( rc ) sqli
1b1f0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
1b200 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74  ;..  /* Enable t
1b210 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c  he lookaside-mal
1b220 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f  loc subsystem */
1b230 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  .  setupLookasid
1b240 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33  e(db, 0, sqlite3
1b250 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c  GlobalConfig.szL
1b260 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20  ookaside,.      
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b280 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1b290 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65  onfig.nLookaside
1b2a0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  );..  sqlite3_wa
1b2b0 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
1b2c0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  (db, SQLITE_DEFA
1b2d0 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43  ULT_WAL_AUTOCHEC
1b2e0 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62  KPOINT);..opendb
1b2f0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29  _out:.  if( db )
1b300 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
1b310 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73  ->mutex!=0 || is
1b320 54 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20  Threadsafe==0.  
1b330 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
1b340 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1b350 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
1b360 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1b370 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1b380 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
1b390 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1b3a0 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
1b3b0 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  b!=0 || rc==SQLI
1b3c0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66  TE_NOMEM );.  if
1b3d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
1b3e0 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
1b3f0 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
1b400 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
1b410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b420 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
1b430 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1b440 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 23 69 66  IC_SICK;.  }.#if
1b450 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1b460 5f 5f 29 20 26 26 20 45 4e 41 42 4c 45 5f 46 4f  __) && ENABLE_FO
1b470 52 43 45 5f 57 41 4c 0a 20 20 69 66 28 20 64 62  RCE_WAL.  if( db
1b480 20 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20 69   && !rc ){.    i
1b490 66 20 28 28 30 20 3d 3d 20 61 63 63 65 73 73 28  f ((0 == access(
1b4a0 22 2f 76 61 72 2f 64 62 2f 65 6e 61 62 6c 65 46  "/var/db/enableF
1b4b0 6f 72 63 65 57 41 4c 22 2c 20 52 5f 4f 4b 29 29  orceWAL", R_OK))
1b4c0 29 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ) {.#ifdef SQLIT
1b4d0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 70  E_DEBUG.      fp
1b4e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
1b4f0 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61  QLite WAL journa
1b500 6c 5f 6d 6f 64 65 20 45 4e 41 42 4c 45 44 20 62  l_mode ENABLED b
1b510 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22 29 3b 0a  y default.\n");.
1b520 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20  #endif.      .  
1b530 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
1b540 28 64 62 2c 20 22 70 72 61 67 6d 61 20 6a 6f 75  (db, "pragma jou
1b550 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 2c 20  rnal_mode=wal", 
1b560 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
1b570 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1b580 5f 44 45 42 55 47 0a 2f 2f 20 20 20 20 7d 20 65  _DEBUG.//    } e
1b590 6c 73 65 20 7b 0a 2f 2f 20 20 20 20 20 20 66 70  lse {.//      fp
1b5a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
1b5b0 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75 72 6e 61  QLite WAL journa
1b5c0 6c 5f 6d 6f 64 65 20 4e 4f 54 20 45 4e 41 42 4c  l_mode NOT ENABL
1b5d0 45 44 20 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e  ED by default.\n
1b5e0 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ");.#endif.    }
1b5f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
1b600 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1b610 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49  NABLE_AUTO_PROFI
1b620 4c 45 29 0a 20 20 69 66 28 20 64 62 20 26 26 20  LE).  if( db && 
1b630 21 72 63 20 29 7b 0a 20 20 20 20 65 6e 61 62 6c  !rc ){.    enabl
1b640 65 41 75 74 6f 4c 6f 67 67 69 6e 67 28 64 62 29  eAutoLogging(db)
1b650 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  ;.  }.#endif.  *
1b660 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65  ppDb = db;.#ifde
1b670 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b680 53 51 4c 52 52 0a 20 20 53 52 52 65 63 4f 70 65  SQLRR.  SRRecOpe
1b690 6e 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  n(db, zFilename,
1b6a0 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64 69 66 0a   flags);.#endif.
1b6b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b6c0 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
1b6d0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1b6e0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
1b6f0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20  .    /* Opening 
1b700 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75  a db handle. Fou
1b710 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73  rth parameter is
1b720 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20   passed 0. */.  
1b730 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73    void *pArg = s
1b740 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b750 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20  ig.pSqllogArg;. 
1b760 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1b770 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70  Config.xSqllog(p
1b780 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61  Arg, db, zFilena
1b790 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  me, 0);.  }.#end
1b7a0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
1b7b0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
1b7c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b7d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
1b7e0 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20  t char *zKey;.  
1b7f0 20 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71    if( (zKey = sq
1b800 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1b810 74 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65 78 6b  ter(zOpen, "hexk
1b820 65 79 22 29 29 21 3d 30 20 26 26 20 7a 4b 65 79  ey"))!=0 && zKey
1b830 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 75 38 20  [0] ){.      u8 
1b840 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74  iByte;.      int
1b850 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   i;.      char z
1b860 44 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20 20  Decoded[40];.   
1b870 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74     for(i=0, iByt
1b880 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 44  e=0; i<sizeof(zD
1b890 65 63 6f 64 65 64 29 2a 32 20 26 26 20 73 71 6c  ecoded)*2 && sql
1b8a0 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 4b 65  ite3Isxdigit(zKe
1b8b0 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  y[i]); i++){.   
1b8c0 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42       iByte = (iB
1b8d0 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65  yte<<4) + sqlite
1b8e0 33 48 65 78 54 6f 49 6e 74 28 7a 4b 65 79 5b 69  3HexToInt(zKey[i
1b8f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
1b900 28 69 26 31 29 21 3d 30 20 29 20 7a 44 65 63 6f  (i&1)!=0 ) zDeco
1b910 64 65 64 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65  ded[i/2] = iByte
1b920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b930 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64  sqlite3_key_v2(d
1b940 62 2c 20 30 2c 20 7a 44 65 63 6f 64 65 64 2c 20  b, 0, zDecoded, 
1b950 69 2f 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  i/2);.    }else 
1b960 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69  if( (zKey = sqli
1b970 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1b980 72 28 7a 4f 70 65 6e 2c 20 22 6b 65 79 22 29 29  r(zOpen, "key"))
1b990 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
1b9a0 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20  ite3_key_v2(db, 
1b9b0 30 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74 65 33  0, zKey, sqlite3
1b9c0 53 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29 29 3b  Strlen30(zKey));
1b9d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1b9e0 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
1b9f0 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72  (zOpen);.  retur
1ba00 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a  n rc & 0xff;.}..
1ba10 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
1ba20 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1ba30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ba40 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
1ba50 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1ba60 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
1ba70 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  b .){.  return o
1ba80 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
1ba90 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20  ename, ppDb,.   
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
1bac0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
1bad0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
1bae0 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1baf0 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73  _open_v2(.  cons
1bb00 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
1bb10 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ,   /* Database 
1bb20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29  filename (UTF-8)
1bb30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
1bb40 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  ppDb,         /*
1bb50 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20   OUT: SQLite db 
1bb60 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
1bb70 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1bb80 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
1bb90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
1bba0 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  fs        /* Nam
1bbb0 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20  e of VFS module 
1bbc0 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72  to use */.){.  r
1bbd0 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
1bbe0 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44  se(filename, ppD
1bbf0 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  b, (unsigned int
1bc00 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d  )flags, zVfs);.}
1bc10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1bc20 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
1bc30 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
1bc40 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
1bc50 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1bc60 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69  n16(.  const voi
1bc70 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  d *zFilename, . 
1bc80 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a   sqlite3 **ppDb.
1bc90 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
1bca0 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f  *zFilename8;   /
1bcb0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f  * zFilename enco
1bcc0 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73  ded in UTF-8 ins
1bcd0 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a  tead of UTF-16 *
1bce0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1bcf0 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
1bd00 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
1bd10 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1bd20 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
1bd30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1bd40 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1bd50 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
1bd60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1bd70 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
1bd80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
1bd90 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
1bda0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1bdb0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  ;.#endif.  if( z
1bdc0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46  Filename==0 ) zF
1bdd0 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c  ilename = "\000\
1bde0 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73  000";.  pVal = s
1bdf0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
1be00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
1be10 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
1be20 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c  , zFilename, SQL
1be30 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c  ITE_UTF16NATIVE,
1be40 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1be50 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20  .  zFilename8 = 
1be60 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1be70 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
1be80 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  F8);.  if( zFile
1be90 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  name8 ){.    rc 
1bea0 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  = openDatabase(z
1beb0 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c  Filename8, ppDb,
1bec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bed0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1bee0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1bef0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1bf00 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  E, 0);.    asser
1bf10 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d  t( *ppDb || rc==
1bf20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
1bf30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bf40 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50  TE_OK && !DbHasP
1bf50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30  roperty(*ppDb, 0
1bf60 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
1bf70 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45  d) ){.      SCHE
1bf80 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20  MA_ENC(*ppDb) = 
1bf90 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c  ENC(*ppDb) = SQL
1bfa0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
1bfb0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1bfc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bfd0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
1bfe0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
1bff0 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
1c000 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d  urn rc & 0xff;.}
1c010 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c020 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1c030 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1c040 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
1c050 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
1c060 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1c070 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
1c080 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
1c090 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
1c0a0 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
1c0b0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
1c0c0 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
1c0d0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
1c0e0 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
1c0f0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
1c100 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
1c110 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1c120 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1c130 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65  ion_v2(db, zName
1c140 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  , enc, pCtx, xCo
1c150 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  mpare, 0);.}../*
1c160 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
1c170 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
1c180 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
1c190 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
1c1a0 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
1c1b0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1c1c0 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
1c1d0 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
1c1e0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
1c1f0 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
1c200 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
1c210 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
1c220 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
1c230 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
1c240 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
1c250 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
1c260 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1c270 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1c280 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1c290 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1c2a0 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
1c2b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1c2c0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1c2d0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1c2e0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1c2f0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
1c300 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c310 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
1c320 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
1c330 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
1c340 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
1c350 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
1c360 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
1c370 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
1c380 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1c390 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1c3a0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1c3b0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1c3c0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
1c3d0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
1c3e0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
1c3f0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1c400 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
1c410 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
1c420 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
1c430 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
1c440 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
1c450 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
1c460 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
1c470 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
1c480 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
1c490 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
1c4a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1c4b0 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
1c4c0 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20  zName8;..#ifdef 
1c4d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1c4e0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1c4f0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1c500 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
1c510 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1c520 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1c530 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1c540 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1c550 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
1c560 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
1c570 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
1c580 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
1c590 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
1c5a0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
1c5b0 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e  ATIVE);.  if( zN
1c5c0 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
1c5d0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
1c5e0 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38  (db, zName8, (u8
1c5f0 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
1c600 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
1c610 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c620 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
1c630 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
1c640 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
1c650 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1c660 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1c670 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1c680 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c690 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
1c6a0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
1c6b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c6c0 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
1c6d0 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
1c6e0 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
1c6f0 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
1c700 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
1c710 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1c720 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1c730 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1c740 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
1c750 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
1c760 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
1c770 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
1c780 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
1c790 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
1c7a0 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
1c7b0 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66  char*).){.#ifdef
1c7c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1c7d0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1c7e0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1c7f0 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1c800 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1c810 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1c820 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1c830 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1c840 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
1c850 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a   = xCollNeeded;.
1c860 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1c870 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70  d16 = 0;.  db->p
1c880 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
1c890 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
1c8a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c8b0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1c8c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c8d0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1c8e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1c8f0 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
1c900 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
1c910 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
1c920 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
1c930 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1c940 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
1c950 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
1c960 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
1c970 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
1c980 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
1c990 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
1c9a0 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65  eded16(.  sqlite
1c9b0 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
1c9c0 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
1c9d0 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
1c9e0 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71  eded16)(void*,sq
1c9f0 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1ca00 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  Rep,const void*)
1ca10 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1ca20 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1ca30 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1ca40 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1ca50 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1ca60 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1ca70 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1ca80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1ca90 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1caa0 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a  CollNeeded = 0;.
1cab0 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1cac0 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  d16 = xCollNeede
1cad0 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  d16;.  db->pColl
1cae0 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
1caf0 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
1cb00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1cb10 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1cb20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cb30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1cb40 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1cb50 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1cb60 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
1cb70 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ED./*.** This fu
1cb80 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
1cb90 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
1cba0 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
1cbb0 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
1cbc0 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
1cbd0 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
1cbe0 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
1cbf0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
1cc00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
1cc10 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
1cc20 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
1cc30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1cc40 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
1cc50 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
1cc60 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
1cc70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
1cc80 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
1cc90 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
1cca0 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
1ccb0 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
1ccc0 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
1ccd0 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
1cce0 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
1ccf0 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
1cd00 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
1cd10 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
1cd20 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
1cd30 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
1cd40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cd50 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
1cd60 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
1cd70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1cd80 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1cd90 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1cda0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1cdb0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1cdc0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1cdd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1cde0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1cdf0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a  db->autoCommit;.
1ce00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1ce10 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
1ce20 61 72 65 20 73 75 62 73 74 69 74 75 74 65 73 20  are substitutes 
1ce30 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51  for constants SQ
1ce40 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a  LITE_CORRUPT,.**
1ce50 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20   SQLITE_MISUSE, 
1ce60 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
1ce70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1ce80 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72  d possibly other
1ce90 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61   error.** consta
1cea0 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65  nts.  They serve
1ceb0 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a   two purposes:.*
1cec0 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65  *.**   1.  Serve
1ced0 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74   as a convenient
1cee0 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
1cef0 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20  breakpoint in a 
1cf00 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20  debugger.**     
1cf10 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e    to detect when
1cf20 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63   version error c
1cf30 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73  onditions occurs
1cf40 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e  ..**.**   2.  In
1cf50 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67  voke sqlite3_log
1cf60 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  () to provide th
1cf70 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f  e source code lo
1cf80 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  cation where.** 
1cf90 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65        a low-leve
1cfa0 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74  l error is first
1cfb0 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e   detected..*/.in
1cfc0 74 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45  t sqlite3ReportE
1cfd0 72 72 6f 72 28 69 6e 74 20 69 45 72 72 2c 20 69  rror(int iErr, i
1cfe0 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74  nt lineno, const
1cff0 20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20   char *zType){. 
1d000 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72   sqlite3_log(iEr
1d010 72 2c 20 22 25 73 20 61 74 20 6c 69 6e 65 20 25  r, "%s at line %
1d020 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79               zTy
1d040 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73  pe, lineno, 20+s
1d050 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
1d060 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 45 72  ));.  return iEr
1d070 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  r;.}.int sqlite3
1d080 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
1d090 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1d0a0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1d0b0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1d0c0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
1d0d0 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1d0e0 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c  (SQLITE_CORRUPT,
1d0f0 20 6c 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61   lineno, "databa
1d100 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b  se corruption");
1d110 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69  .}.int sqlite3Mi
1d120 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69  suseError(int li
1d130 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1d140 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1d150 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1d160 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1d170 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1d180 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e  LITE_MISUSE, lin
1d190 65 6e 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a  eno, "misuse");.
1d1a0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e  }.int sqlite3Can
1d1b0 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c  topenError(int l
1d1c0 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1d1d0 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1d1e0 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1d1f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1d200 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53  te3ReportError(S
1d210 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
1d220 6c 69 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20  lineno, "cannot 
1d230 6f 70 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23  open file");.}.#
1d240 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d250 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  UG.int sqlite3Co
1d260 72 72 75 70 74 50 67 6e 6f 45 72 72 6f 72 28 69  rruptPgnoError(i
1d270 6e 74 20 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20  nt lineno, Pgno 
1d280 70 67 6e 6f 29 7b 0a 20 20 63 68 61 72 20 7a 4d  pgno){.  char zM
1d290 73 67 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74  sg[100];.  sqlit
1d2a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1d2b0 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c 20  of(zMsg), zMsg, 
1d2c0 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
1d2d0 74 69 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 70  tion page %d", p
1d2e0 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
1d2f0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1d300 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1d310 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1d320 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1d330 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e  ITE_CORRUPT, lin
1d340 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e  eno, zMsg);.}.in
1d350 74 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72  t sqlite3NomemEr
1d360 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1d370 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1d380 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1d390 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1d3a0 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1d3b0 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e  rtError(SQLITE_N
1d3c0 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f  OMEM, lineno, "O
1d3d0 4f 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  OM");.}.int sqli
1d3e0 74 65 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72  te3IoerrnomemErr
1d3f0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1d400 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1d410 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d420 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1d430 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1d440 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  tError(SQLITE_IO
1d450 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e  ERR_NOMEM, linen
1d460 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f  o, "I/O OOM erro
1d470 72 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  r");.}.#endif..#
1d480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d490 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1d4a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
1d4b0 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
1d4c0 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
1d4d0 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
1d4e0 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
1d4f0 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
1d500 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
1d510 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
1d520 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
1d530 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
1d540 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
1d550 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
1d560 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
1d570 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
1d580 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
1d590 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
1d5a0 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
1d5b0 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
1d5c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1d5d0 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
1d5e0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
1d5f0 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
1d600 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
1d610 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
1d620 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
1d630 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
1d640 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
1d650 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
1d660 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
1d670 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
1d680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d690 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1d6a0 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
1d6b0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1d6c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1d6d0 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
1d6e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1d6f0 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
1d700 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
1d710 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1d720 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
1d730 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
1d740 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
1d750 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
1d760 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
1d770 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
1d780 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
1d790 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
1d7a0 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
1d7b0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1d7c0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
1d7d0 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
1d7e0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1d7f0 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
1d800 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
1d810 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
1d820 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
1d830 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1d840 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
1d850 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
1d860 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
1d870 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1d880 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
1d890 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
1d8a0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
1d8b0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
1d8c0 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
1d8d0 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
1d8e0 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
1d8f0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a    int iCol = 0;.
1d900 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44    char const *zD
1d910 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63  ataType = 0;.  c
1d920 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1d930 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Seq = 0;.  int n
1d940 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e  otnull = 0;.  in
1d950 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30  t primarykey = 0
1d960 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20  ;.  int autoinc 
1d970 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51  = 0;...#ifdef SQ
1d980 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1d990 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1d9a0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1d9b0 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e  k(db) || zTableN
1d9c0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1d9d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1d9e0 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
1d9f0 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  dif..  /* Ensure
1da00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1da10 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f  hema has been lo
1da20 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  aded */.  sqlite
1da30 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1da40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
1da50 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
1da60 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (db);.  rc = sql
1da70 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45  ite3Init(db, &zE
1da80 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51  rrMsg);.  if( SQ
1da90 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
1daa0 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1dab0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  t;.  }..  /* Loc
1dac0 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
1dad0 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70   question */.  p
1dae0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
1daf0 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c  dTable(db, zTabl
1db00 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b  eName, zDbName);
1db10 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20  .  if( !pTab || 
1db20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
1db30 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20  .    pTab = 0;. 
1db40 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1db50 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  t;.  }..  /* Fin
1db60 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  d the column for
1db70 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72   which info is r
1db80 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66  equested */.  if
1db90 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30  ( zColumnName==0
1dba0 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79   ){.    /* Query
1dbb0 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f   for existance o
1dbc0 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a  f table only */.
1dbd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
1dbe0 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
1dbf0 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
1dc00 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
1dc10 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
1dc20 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
1dc30 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1dc40 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
1dc50 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1dc60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1dc70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1dc80 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f   iCol==pTab->nCo
1dc90 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48  l ){.      if( H
1dca0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1dcb0 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
1dcc0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
1dcd0 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70          iCol = p
1dce0 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
1dcf0 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e      pCol = iCol>
1dd00 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c  =0 ? &pTab->aCol
1dd10 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20  [iCol] : 0;.    
1dd20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dd30 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
1dd40 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1dd50 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1dd60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1dd70 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
1dd80 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69  tores the meta i
1dd90 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
1dda0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1ddb0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  .  ** to the cal
1ddc0 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  ler in local var
1ddd0 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65  iables zDataType
1dde0 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e  , zCollSeq, notn
1ddf0 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a  ull, primarykey.
1de00 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63    ** and autoinc
1de10 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1de20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f  there are two po
1de30 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a  ssibilities:.  *
1de40 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54  * .  **     1. T
1de50 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  he specified col
1de60 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77  umn name was row
1de70 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f  id", "oid" or "_
1de80 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20  rowid_" .  **   
1de90 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69       and there i
1dea0 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20  s no explicitly 
1deb0 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c  declared IPK col
1dec0 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  umn. .  **.  ** 
1ded0 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65      2. The table
1dee0 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61   is not a view a
1def0 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  nd the column na
1df00 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e  me identified an
1df10 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78   .  **        ex
1df20 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
1df30 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d  d column. Copy m
1df40 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
1df50 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f  from *pCol..  */
1df60 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a   .  if( pCol ){.
1df70 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
1df80 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
1df90 65 28 70 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a  e(pCol,0);.    z
1dfa0 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e  CollSeq = pCol->
1dfb0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75  zColl;.    notnu
1dfc0 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75  ll = pCol->notNu
1dfd0 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61  ll!=0;.    prima
1dfe0 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e  rykey  = (pCol->
1dff0 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
1e000 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a  AG_PRIMKEY)!=0;.
1e010 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54      autoinc = pT
1e020 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
1e030 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
1e040 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
1e050 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c  ement)!=0;.  }el
1e060 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70  se{.    zDataTyp
1e070 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
1e080 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20     primarykey = 
1e090 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43  1;.  }.  if( !zC
1e0a0 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43  ollSeq ){.    zC
1e0b0 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74 65 33  ollSeq = sqlite3
1e0c0 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a  StrBINARY;.  }..
1e0d0 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
1e0e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
1e0f0 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  l(db);..  /* Whe
1e100 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  ther the functio
1e110 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64  n call succeeded
1e120 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20   or failed, set 
1e130 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
1e140 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68  eters.  ** to wh
1e150 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63  atever their loc
1e160 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20  al counterparts 
1e170 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65  contain. If an e
1e180 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a  rror did occur,.
1e190 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68    ** this has th
1e1a0 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f  e effect of zero
1e1b0 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70  ing all output p
1e1c0 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
1e1d0 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65    if( pzDataType
1e1e0 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d   ) *pzDataType =
1e1f0 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66   zDataType;.  if
1e200 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70  ( pzCollSeq ) *p
1e210 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c  zCollSeq = zColl
1e220 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e  Seq;.  if( pNotN
1e230 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20  ull ) *pNotNull 
1e240 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28  = notnull;.  if(
1e250 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a   pPrimaryKey ) *
1e260 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72  pPrimaryKey = pr
1e270 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20  imarykey;.  if( 
1e280 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74  pAutoinc ) *pAut
1e290 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a  oinc = autoinc;.
1e2a0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1e2b0 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b  ==rc && !pTab ){
1e2c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1e2d0 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
1e2e0 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
1e2f0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1e300 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1e310 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c   column: %s.%s",
1e320 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20   zTableName,.   
1e330 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65       zColumnName
1e340 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1e350 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1e360 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
1e370 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  Msg(db, rc, (zEr
1e380 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
1e390 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1e3a0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1e3b0 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
1e3c0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
1e3d0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
1e3e0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1e3f0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1e400 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  rc;.}../*.** Sle
1e410 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
1e420 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
1e430 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
1e440 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20  e slept..*/.int 
1e450 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e  sqlite3_sleep(in
1e460 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  t ms){.  sqlite3
1e470 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e  _vfs *pVfs;.  in
1e480 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73  t rc;.  pVfs = s
1e490 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1e4a0 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d  0);.  if( pVfs==
1e4b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
1e4c0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
1e4d0 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69  n works in milli
1e4e0 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65  seconds, but the
1e4f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c   underlying OsSl
1e500 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20  eep() .  ** API 
1e510 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64  uses microsecond
1e520 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30  s. Hence the 100
1e530 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  0's..  */.  rc =
1e540 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70   (sqlite3OsSleep
1e550 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f  (pVfs, 1000*ms)/
1e560 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
1e570 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61  rc;.}../*.** Ena
1e580 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
1e590 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75  he extended resu
1e5a0 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74  lt codes..*/.int
1e5b0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1e5c0 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73  d_result_codes(s
1e5d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1e5e0 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66 20 53  onoff){.#ifdef S
1e5f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1e600 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1e610 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1e620 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1e630 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1e640 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1e650 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e660 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
1e670 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f  b->errMask = ono
1e680 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  ff ? 0xffffffff 
1e690 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65  : 0xff;.  sqlite
1e6a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1e6b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1e6c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e6d0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
1e6e0 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d  e xFileControl m
1e6f0 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69  ethod on a parti
1e700 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a  cular database..
1e710 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  */.int sqlite3_f
1e720 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69  ile_control(sqli
1e730 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1e740 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e  har *zDbName, in
1e750 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1e760 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e770 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74  LITE_ERROR;.  Bt
1e780 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69  ree *pBtree;..#i
1e790 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1e7a0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1e7b0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1e7c0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1e7d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1e7e0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1e7f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1e800 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1e810 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71  );.  pBtree = sq
1e820 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
1e830 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
1e840 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1e850 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
1e860 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  er;.    sqlite3_
1e870 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71  file *fd;.    sq
1e880 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1e890 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61  pBtree);.    pPa
1e8a0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
1e8b0 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b  eePager(pBtree);
1e8c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e8d0 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64  ger!=0 );.    fd
1e8e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
1e8f0 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
1e900 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29   assert( fd!=0 )
1e910 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51  ;.    if( op==SQ
1e920 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f  LITE_FCNTL_FILE_
1e930 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1e940 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a   *(sqlite3_file*
1e950 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20  *)pArg = fd;.   
1e960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1e970 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1e980 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
1e990 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b  L_VFS_POINTER ){
1e9a0 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1e9b0 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d 20 73 71  _vfs**)pArg = sq
1e9c0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 50  lite3PagerVfs(pP
1e9d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
1e9e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1e9f0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53   }else if( op==S
1ea00 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52  QLITE_FCNTL_JOUR
1ea10 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20  NAL_POINTER ){. 
1ea20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66       *(sqlite3_f
1ea30 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  ile**)pArg = sql
1ea40 69 74 65 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c  ite3PagerJrnlFil
1ea50 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
1ea60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ea70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ea80 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 69  OMIT_WAL.      i
1ea90 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
1eaa0 4b 29 26 26 28 6f 70 3d 3d 53 51 4c 49 54 45 5f  K)&&(op==SQLITE_
1eab0 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f  FCNTL_LAST_ERRNO
1eac0 29 26 26 28 2a 28 69 6e 74 20 2a 29 70 41 72 67  )&&(*(int *)pArg
1ead0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
1eae0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57  sqlite3_file *pW
1eaf0 61 6c 46 64 20 3d 20 73 71 6c 69 74 65 33 50 61  alFd = sqlite3Pa
1eb00 67 65 72 57 61 6c 46 69 6c 65 28 70 50 61 67 65  gerWalFile(pPage
1eb10 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1eb20 70 57 61 6c 46 64 26 26 28 70 57 61 6c 46 64 2d  pWalFd&&(pWalFd-
1eb30 3e 70 4d 65 74 68 6f 64 73 29 20 29 7b 0a 20 20  >pMethods) ){.  
1eb40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1eb50 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1eb60 6c 28 70 57 61 6c 46 64 2c 20 6f 70 2c 20 70 41  l(pWalFd, op, pA
1eb70 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rg);.        }. 
1eb80 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1eb90 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1eba0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54  SQLITE_FCNTL_DAT
1ebb0 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20  A_VERSION ){.   
1ebc0 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e     *(unsigned in
1ebd0 74 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  t*)pArg = sqlite
1ebe0 33 50 61 67 65 72 44 61 74 61 56 65 72 73 69 6f  3PagerDataVersio
1ebf0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  n(pPager);.     
1ec00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ec10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ec20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ec30 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
1ec40 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  op, pArg);.    }
1ec50 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1ec60 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1ec70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1ec80 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  or(db, rc);.  sq
1ec90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1eca0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1ecb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ecc0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
1ecd0 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67   the testing log
1ece0 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ic..*/.int sqlit
1ecf0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ed00 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
1ed10 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64  int rc = 0;.#ifd
1ed20 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54  ef SQLITE_UNTEST
1ed30 41 42 4c 45 0a 20 20 55 4e 55 53 45 44 5f 50 41  ABLE.  UNUSED_PA
1ed40 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65 6c  RAMETER(op);.#el
1ed50 73 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  se.  va_list ap;
1ed60 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1ed70 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
1ed80 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  p ){..    /*.   
1ed90 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72   ** Save the cur
1eda0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
1edb0 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20  e PRNG..    */. 
1edc0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1edd0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56  ESTCTRL_PRNG_SAV
1ede0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1edf0 65 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28  e3PrngSaveState(
1ee00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ee10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1ee20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65    ** Restore the
1ee30 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
1ee40 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73  NG to the last s
1ee50 74 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67  tate saved using
1ee60 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56  .    ** PRNG_SAV
1ee70 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45  E.  If PRNG_SAVE
1ee80 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72   has never befor
1ee90 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  e been called, t
1eea0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  hen.    ** this 
1eeb0 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50  verb acts like P
1eec0 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a  RNG_RESET..    *
1eed0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1eee0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1eef0 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20  RESTORE: {.     
1ef00 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74   sqlite3PrngRest
1ef10 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  oreState();.    
1ef20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1ef30 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
1ef40 73 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63  set the PRNG bac
1ef50 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69  k to its uniniti
1ef60 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54  alized state.  T
1ef70 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20  he next call.   
1ef80 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72   ** to sqlite3_r
1ef90 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c  andomness() will
1efa0 20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47   reseed the PRNG
1efb0 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
1efc0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74  call.    ** to t
1efd0 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d  he xRandomness m
1efe0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66  ethod of the def
1eff0 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f  ault VFS..    */
1f000 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f010 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
1f020 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  ESET: {.      sq
1f030 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1f040 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72 65  (0,0);.      bre
1f050 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1f060 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1f070 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
1f080 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65  ITVEC_TEST, size
1f090 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a  , program).    *
1f0a0 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74  *.    ** Run a t
1f0b0 65 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69  est against a Bi
1f0c0 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73  tvec object of s
1f0d0 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61  ize.  The progra
1f0e0 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a  m argument.    *
1f0f0 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
1f100 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64   integers that d
1f110 65 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e  efines the test.
1f120 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61    Return -1 on a
1f130 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61  .    ** memory a
1f140 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c  llocation error,
1f150 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f   0 on success, o
1f160 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61  r non-zero for a
1f170 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20  n error..    ** 
1f180 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42  See the sqlite3B
1f190 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
1f1a0 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
1f1b0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
1f1c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1f1d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1f1e0 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20  ITVEC_TEST: {.  
1f1f0 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
1f200 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1f210 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d      int *aProg =
1f220 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
1f230 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1f240 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
1f250 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67  inTest(sz, aProg
1f260 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f270 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1f280 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1f290 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54  st_control(FAULT
1f2a0 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c 62  _INSTALL, xCallb
1f2b0 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ack).    **.    
1f2c0 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69 6e  ** Arrange to in
1f2d0 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28 29  voke xCallback()
1f2e0 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65   whenever sqlite
1f2f0 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20 63  3FaultSim() is c
1f300 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69 66  alled,.    ** if
1f310 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f   xCallback is no
1f320 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20  t NULL..    **. 
1f330 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74 20     ** As a test 
1f340 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73 69 6d  of the fault sim
1f350 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d  ulator mechanism
1f360 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65 33   itself, sqlite3
1f370 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20 20  FaultSim(0).    
1f380 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d  ** is called imm
1f390 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 69  ediately after i
1f3a0 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e 65  nstalling the ne
1f3b0 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74  w callback and t
1f3c0 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  he return.    **
1f3d0 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69   value from sqli
1f3e0 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20 62  te3FaultSim(0) b
1f3f0 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75 72  ecomes the retur
1f400 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  n from.    ** sq
1f410 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1f420 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ol()..    */.   
1f430 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1f440 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54  TCTRL_FAULT_INST
1f450 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ALL: {.      /* 
1f460 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62  MSVC is picky ab
1f470 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63  out pulling func
1f480 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69   ptrs from va li
1f490 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74  sts..      ** ht
1f4a0 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63  tp://support.mic
1f4b0 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37  rosoft.com/kb/47
1f4c0 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  961.      ** sql
1f4d0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f4e0 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
1f4f0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 28   va_arg(ap, int(
1f500 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  *)(int));.      
1f510 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  */.      typedef
1f520 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42 41   int(*TESTCALLBA
1f530 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b 0a  CKFUNC_t)(int);.
1f540 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1f550 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43  balConfig.xTestC
1f560 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67  allback = va_arg
1f570 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41 43  (ap, TESTCALLBAC
1f580 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  KFUNC_t);.      
1f590 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c  rc = sqlite3Faul
1f5a0 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20 62  tSim(0);.      b
1f5b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1f5c0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1f5d0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1f5e0 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  (BENIGN_MALLOC_H
1f5f0 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45  OOKS, xBegin, xE
1f600 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd).    **.    *
1f610 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73  * Register hooks
1f620 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69   to call to indi
1f630 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f  cate which mallo
1f640 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20  c() failures .  
1f650 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e    ** are benign.
1f660 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1f670 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1f680 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  _BENIGN_MALLOC_H
1f690 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79  OOKS: {.      ty
1f6a0 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69  pedef void (*voi
1f6b0 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64  d_function)(void
1f6c0 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  );.      void_fu
1f6d0 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65  nction xBenignBe
1f6e0 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  gin;.      void_
1f6f0 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
1f700 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  End;.      xBeni
1f710 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67  gnBegin = va_arg
1f720 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
1f730 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  on);.      xBeni
1f740 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61  gnEnd = va_arg(a
1f750 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
1f760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f770 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b  BenignMallocHook
1f780 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20  s(xBenignBegin, 
1f790 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20  xBenignEnd);.   
1f7a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f7b0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1f7c0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1f7d0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1f7e0 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
1f7f0 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  E, unsigned int 
1f800 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1f810 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47   Set the PENDING
1f820 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c   byte to the val
1f830 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ue in the argume
1f840 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20  nt, if X>0..    
1f850 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
1f860 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74  es if X==0.  Ret
1f870 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
1f880 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74   the pending byt
1f890 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65  e.    ** as it e
1f8a0 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74  xisting before t
1f8b0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1f8c0 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  called..    **. 
1f8d0 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a     ** IMPORTANT:
1f8e0 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
1f8f0 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d  ENDING byte from
1f900 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75   0x40000000 resu
1f910 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e  lts in.    ** an
1f920 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61   incompatible da
1f930 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d  tabase file form
1f940 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68  at.  Changing th
1f950 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20  e PENDING byte. 
1f960 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20     ** while any 
1f970 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1f980 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75  ion is open resu
1f990 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64  lts in undefined
1f9a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
1f9b0 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72  terious behavior
1f9c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1f9d0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1f9e0 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20  L_PENDING_BYTE: 
1f9f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e  {.      rc = PEN
1fa00 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64  DING_BYTE;.#ifnd
1fa10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1fa20 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  SD.      {.     
1fa30 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
1fa40 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28  newVal = va_arg(
1fa50 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ap, unsigned int
1fa60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1fa70 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50  ewVal ) sqlite3P
1fa80 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77  endingByte = new
1fa90 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Val;.      }.#en
1faa0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
1fab0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1fac0 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1fad0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1fae0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1faf0 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  RT, int X).    *
1fb00 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
1fb10 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
1fb20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
1fb30 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
1fb40 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  not.    ** asser
1fb50 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20  t() was enabled 
1fb60 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
1fb70 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
1fb80 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20  nd assert().    
1fb90 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ** is enabled, t
1fba0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
1fbb0 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49  alue is true.  I
1fbc0 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a  f X is true and.
1fbd0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
1fbe0 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
1fbf0 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
1fc00 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20  ue is zero.  If 
1fc10 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73  X is.    ** fals
1fc20 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
1fc30 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
1fc40 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69  the assertion fi
1fc50 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20  res and the.    
1fc60 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74  ** process abort
1fc70 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73  s.  If X is fals
1fc80 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
1fc90 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
1fca0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75   the.    ** retu
1fcb0 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
1fcc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1fcd0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1fce0 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20  L_ASSERT: {.    
1fcf0 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78    volatile int x
1fd00 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
1fd10 72 74 28 20 2f 2a 73 69 64 65 2d 65 66 66 65 63  rt( /*side-effec
1fd20 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20 76 61 5f  ts-ok*/ (x = va_
1fd30 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20  arg(ap,int))!=0 
1fd40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b  );.      rc = x;
1fd50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fd60 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
1fd70 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1fd80 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1fd90 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1fda0 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
1fdb0 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
1fdc0 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
1fdd0 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
1fde0 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59  ee how the ALWAY
1fdf0 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56  S and.    ** NEV
1fe00 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64  ER macros were d
1fe10 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  efined at compil
1fe20 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20  e-time..    **. 
1fe30 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e     ** The return
1fe40 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53   value is ALWAYS
1fe50 28 58 29 20 69 66 20 58 20 69 73 20 74 72 75 65  (X) if X is true
1fe60 2c 20 6f 72 20 30 20 69 66 20 58 20 69 73 20 66  , or 0 if X is f
1fe70 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  alse..    **.   
1fe80 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
1fe90 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
1fea0 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1feb0 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
1fec0 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
1fed0 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
1fee0 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
1fef0 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
1ff00 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
1ff10 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
1ff20 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
1ff30 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1ff40 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
1ff50 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
1ff60 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
1ff70 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
1ff80 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
1ff90 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
1ffa0 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
1ffb0 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
1ffc0 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
1ffd0 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
1ffe0 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
1fff0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
20000 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
20010 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
20020 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
20030 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
20040 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
20050 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
20060 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
20070 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
20080 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
20090 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
200a0 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
200b0 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
200c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
200d0 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
200e0 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
200f0 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
20100 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
20110 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
20120 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
20130 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
20140 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
20150 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
20160 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
20170 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
20180 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
20190 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
201a0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
201b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
201c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
201d0 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
201e0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
201f0 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
20200 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
20210 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
20220 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
20230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
20240 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
20250 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
20260 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
20270 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
20280 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
20290 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
202a0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
202b0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
202c0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
202d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 20  );.      rc = x 
202e0 3f 20 41 4c 57 41 59 53 28 78 29 20 3a 20 30 3b  ? ALWAYS(x) : 0;
202f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20300 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
20310 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  **   sqlite3_tes
20320 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
20330 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
20340 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  DER);.    **.   
20350 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   ** The integer 
20360 72 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c 73  returned reveals
20370 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20   the byte-order 
20380 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20  of the computer 
20390 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20  on which.    ** 
203a0 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69 6e  SQLite is runnin
203b0 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g:.    **.    **
203c0 20 20 20 20 20 20 20 31 20 20 20 20 20 62 69 67         1     big
203d0 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65  -endian,    dete
203e0 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
203f0 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 31  me.    **      1
20400 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64  0     little-end
20410 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20  ian, determined 
20420 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20  at run-time.    
20430 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20 20 62  **  432101     b
20440 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65  ig-endian,    de
20450 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70  termined at comp
20460 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  ile-time.    ** 
20470 20 31 32 33 34 31 30 20 20 20 20 20 6c 69 74 74   123410     litt
20480 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72  le-endian, deter
20490 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
204a0 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20  -time.    */ .  
204b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
204c0 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52  STCTRL_BYTEORDER
204d0 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  : {.      rc = S
204e0 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 2a  QLITE_BYTEORDER*
204f0 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54  100 + SQLITE_LIT
20500 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53  TLEENDIAN*10 + S
20510 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b  QLITE_BIGENDIAN;
20520 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20530 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
20540 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
20550 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
20560 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69  RL_RESERVE, sqli
20570 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a  te3 *db, int N).
20580 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
20590 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  t the nReserve s
205a0 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65  ize to N for the
205b0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f   main database o
205c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
205d0 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e     ** connection
205e0 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   db..    */.    
205f0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
20600 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a  CTRL_RESERVE: {.
20610 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
20620 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
20630 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
20640 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
20650 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  p,int);.      sq
20660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20670 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
20680 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20690 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e  SetPageSize(db->
206a0 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78  aDb[0].pBt, 0, x
206b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
206c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
206d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
206e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
206f0 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f      /*  sqlite3_
20700 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
20710 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
20720 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69  IMIZATIONS, sqli
20730 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a  te3 *db, int N).
20740 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e      **.    ** En
20750 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
20760 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
20770 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e  tions for testin
20780 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65  g purposes.  The
20790 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e   .    ** argumen
207a0 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b  t N is a bitmask
207b0 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   of optimization
207c0 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  s to be disabled
207d0 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  .  For normal.  
207e0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e    ** operation N
207f0 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54   should be 0.  T
20800 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
20810 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28  a test program (
20820 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  like the.    ** 
20830 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f  SQL Logic Test o
20840 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c  r SLT test modul
20850 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73  e) can run the s
20860 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65  ame SQL multiple
20870 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69   times.    ** wi
20880 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  th various optim
20890 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65  izations disable
208a0 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
208b0 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
208c0 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69  .    ** is obtai
208d0 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73  ned in every cas
208e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
208f0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
20900 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
20910 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
20920 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
20930 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
20940 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61      db->dbOptFla
20950 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72  gs = (u16)(va_ar
20960 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66  g(ap, int) & 0xf
20970 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61  fff);.      brea
20980 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
20990 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
209a0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
209b0 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
209c0 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f  E_FAULT, int ono
209d0 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ff);.    **.    
209e0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
209f0 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72  onoff is non-zer
20a00 6f 2c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  o, subsequent ca
20a10 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65  lls to localtime
20a20 28 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 74  ().    ** and it
20a30 73 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  s variants fail.
20a40 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
20a50 6f 2c 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74  o, undo this set
20a60 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ting..    */.   
20a70 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
20a80 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
20a90 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73  FAULT: {.      s
20aa0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
20ab0 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75  ig.bLocaltimeFau
20ac0 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  lt = va_arg(ap, 
20ad0 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
20ae0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
20af0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
20b00 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
20b10 45 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c  ESTCTRL_INTERNAL
20b20 5f 46 55 4e 43 53 2c 20 69 6e 74 20 6f 6e 6f 66  _FUNCS, int onof
20b30 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  f);.    **.    *
20b40 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f  * If parameter o
20b50 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  noff is non-zero
20b60 2c 20 69 6e 74 65 72 6e 61 6c 2d 75 73 65 2d 6f  , internal-use-o
20b70 6e 6c 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  nly SQL function
20b80 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 76 69 73  s.    ** are vis
20b90 69 62 6c 65 20 74 6f 20 6f 72 64 69 6e 61 72 79  ible to ordinary
20ba0 20 53 51 4c 2e 20 20 54 68 69 73 20 69 73 20 75   SQL.  This is u
20bb0 73 65 66 75 6c 20 66 6f 72 20 74 65 73 74 69 6e  seful for testin
20bc0 67 20 62 75 74 20 69 73 0a 20 20 20 20 2a 2a 20  g but is.    ** 
20bd0 75 6e 73 61 66 65 20 62 65 63 61 75 73 65 20 69  unsafe because i
20be0 6e 76 61 6c 69 64 20 70 61 72 61 6d 65 74 65 72  nvalid parameter
20bf0 73 20 74 6f 20 74 68 6f 73 65 20 69 6e 74 65 72  s to those inter
20c00 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 66 75 6e  nal-use-only fun
20c10 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 63 61  ctions.    ** ca
20c20 6e 20 72 65 73 75 6c 74 20 69 6e 20 63 72 61 73  n result in cras
20c30 68 65 73 20 6f 72 20 73 65 67 66 61 75 6c 74 73  hes or segfaults
20c40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
20c50 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
20c60 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54  L_INTERNAL_FUNCT
20c70 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  IONS: {.      sq
20c80 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20c90 67 2e 62 49 6e 74 65 72 6e 61 6c 46 75 6e 63 74  g.bInternalFunct
20ca0 69 6f 6e 73 20 3d 20 76 61 5f 61 72 67 28 61 70  ions = va_arg(ap
20cb0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
20cc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
20cd0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
20ce0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
20cf0 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
20d00 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20  CORRUPT, int);. 
20d10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
20d20 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67   or clear a flag
20d30 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
20d40 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
20d50 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  e file is always
20d60 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f   well-.    ** fo
20d70 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63  rmed and never c
20d80 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c  orrupt.  This fl
20d90 61 67 20 69 73 20 63 6c 65 61 72 20 62 79 20 64  ag is clear by d
20da0 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69  efault, indicati
20db0 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64  ng that.    ** d
20dc0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69  atabase files mi
20dd0 67 68 74 20 68 61 76 65 20 61 72 62 69 74 72 61  ght have arbitra
20de0 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ry corruption.  
20df0 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67  Setting the flag
20e00 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74   during.    ** t
20e10 65 73 74 69 6e 67 20 63 61 75 73 65 73 20 63 65  esting causes ce
20e20 72 74 61 69 6e 20 61 73 73 65 72 74 28 29 20 73  rtain assert() s
20e30 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
20e40 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69   code to be acti
20e50 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61  vated.    ** tha
20e60 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76  t demonstrat inv
20e70 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d  ariants on well-
20e80 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
20e90 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
20ea0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
20eb0 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
20ec0 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  RUPT: {.      sq
20ed0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20ee0 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d  g.neverCorrupt =
20ef0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
20f00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20f10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
20f20 20 74 68 65 20 74 68 72 65 73 68 6f 6c 64 20 61   the threshold a
20f30 74 20 77 68 69 63 68 20 4f 50 5f 4f 6e 63 65 20  t which OP_Once 
20f40 63 6f 75 6e 74 65 72 73 20 72 65 73 65 74 20 62  counters reset b
20f50 61 63 6b 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20  ack to zero..   
20f60 20 2a 2a 20 42 79 20 64 65 66 61 75 6c 74 20 74   ** By default t
20f70 68 69 73 20 69 73 20 30 78 37 66 66 66 66 66 66  his is 0x7ffffff
20f80 65 20 28 6f 76 65 72 20 32 20 62 69 6c 6c 69 6f  e (over 2 billio
20f90 6e 29 2c 20 62 75 74 20 74 68 61 74 20 76 61 6c  n), but that val
20fa0 75 65 20 69 73 0a 20 20 20 20 2a 2a 20 74 6f 6f  ue is.    ** too
20fb0 20 62 69 67 20 74 6f 20 74 65 73 74 20 69 6e 20   big to test in 
20fc0 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 61 6d 6f  a reasonable amo
20fd0 75 6e 74 20 6f 66 20 74 69 6d 65 2c 20 73 6f 20  unt of time, so 
20fe0 74 68 69 73 20 63 6f 6e 74 72 6f 6c 20 69 73 0a  this control is.
20ff0 20 20 20 20 2a 2a 20 70 72 6f 76 69 64 65 64 20      ** provided 
21000 74 6f 20 73 65 74 20 61 20 73 6d 61 6c 6c 20 61  to set a small a
21010 6e 64 20 65 61 73 69 6c 79 20 72 65 61 63 68 61  nd easily reacha
21020 62 6c 65 20 72 65 73 65 74 20 76 61 6c 75 65 2e  ble reset value.
21030 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
21040 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
21050 5f 4f 4e 43 45 5f 52 45 53 45 54 5f 54 48 52 45  _ONCE_RESET_THRE
21060 53 48 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20 73  SHOLD: {.      s
21070 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21080 69 67 2e 69 4f 6e 63 65 52 65 73 65 74 54 68 72  ig.iOnceResetThr
21090 65 73 68 6f 6c 64 20 3d 20 76 61 5f 61 72 67 28  eshold = va_arg(
210a0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
210b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
210c0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
210d0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
210e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45  TE_TESTCTRL_VDBE
210f0 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c  _COVERAGE, xCall
21100 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20  back, ptr);.    
21110 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
21120 65 20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20  e VDBE coverage 
21130 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
21140 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77  n to xCallback w
21150 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20  ith context .   
21160 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e   ** pointer ptr.
21170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
21180 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
21190 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20  _VDBE_COVERAGE: 
211a0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
211b0 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
211c0 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
211d0 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61   (*branch_callba
211e0 63 6b 29 28 76 6f 69 64 2a 2c 75 6e 73 69 67 6e  ck)(void*,unsign
211f0 65 64 20 69 6e 74 2c 0a 20 20 20 20 20 20 20 20  ed int,.        
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
21220 73 69 67 6e 65 64 20 63 68 61 72 2c 75 6e 73 69  signed char,unsi
21230 67 6e 65 64 20 63 68 61 72 29 3b 0a 20 20 20 20  gned char);.    
21240 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
21250 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61 6e 63  onfig.xVdbeBranc
21260 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 62 72  h = va_arg(ap,br
21270 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a  anch_callback);.
21280 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
21290 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65 42  balConfig.pVdbeB
212a0 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f 61 72  ranchArg = va_ar
212b0 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e  g(ap,void*);.#en
212c0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
212d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
212e0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
212f0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
21300 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
21310 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f  P, db, nMax); */
21320 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
21330 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
21340 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 73  _MMAP: {.      s
21350 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
21360 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
21370 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 4d 61  );.      db->nMa
21380 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 76 61  xSorterMmap = va
21390 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
213a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
213b0 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
213c0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
213d0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
213e0 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20 20 2a 2a  _ISINIT);.    **
213f0 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 53  .    ** Return S
21400 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51 4c 69  QLITE_OK if SQLi
21410 74 65 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74  te has been init
21420 69 61 6c 69 7a 65 64 20 61 6e 64 20 53 51 4c 49  ialized and SQLI
21430 54 45 5f 45 52 52 4f 52 20 69 66 0a 20 20 20 20  TE_ERROR if.    
21440 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  ** not..    */. 
21450 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
21460 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 3a 20  ESTCTRL_ISINIT: 
21470 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
21480 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
21490 69 73 49 6e 69 74 3d 3d 30 20 29 20 72 63 20 3d  isInit==0 ) rc =
214a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
214b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
214c0 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
214d0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
214e0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
214f0 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 64 62  IMPOSTER, db, db
21500 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75  Name, onOff, tnu
21510 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  m);.    **.    *
21520 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e 74  * This test cont
21530 72 6f 6c 20 69 73 20 75 73 65 64 20 74 6f 20 63  rol is used to c
21540 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74  reate imposter t
21550 61 62 6c 65 73 2e 20 20 22 64 62 22 20 69 73 20  ables.  "db" is 
21560 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a  a pointer.    **
21570 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
21580 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 64 62   connection.  db
21590 4e 61 6d 65 20 69 73 20 74 68 65 20 64 61 74 61  Name is the data
215a0 62 61 73 65 20 6e 61 6d 65 20 28 65 78 3a 20 22  base name (ex: "
215b0 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a 2a 20  main" or.    ** 
215c0 22 74 65 6d 70 22 29 20 77 68 69 63 68 20 77 69  "temp") which wi
215d0 6c 6c 20 72 65 63 65 69 76 65 20 74 68 65 20 69  ll receive the i
215e0 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f 66 66  mposter.  "onOff
215f0 22 20 74 75 72 6e 73 20 69 6d 70 6f 73 74 65 72  " turns imposter
21600 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a 2a 20   mode on.    ** 
21610 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d 22 20  or off.  "tnum" 
21620 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
21630 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 74   of the b-tree t
21640 6f 20 77 68 69 63 68 20 74 68 65 20 69 6d 70 6f  o which the impo
21650 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c  ster.    ** tabl
21660 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65 63 74  e should connect
21670 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
21680 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65 72 20  Enable imposter 
21690 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74  mode only when t
216a0 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 61 6c  he schema has al
216b0 72 65 61 64 79 20 62 65 65 6e 20 70 61 72 73 65  ready been parse
216c0 64 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20  d.  Then.    ** 
216d0 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 43 52 45  run a single CRE
216e0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
216f0 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ent to construct
21700 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61   the imposter ta
21710 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ble in.    ** th
21720 65 20 70 61 72 73 65 64 20 73 63 68 65 6d 61 2e  e parsed schema.
21730 20 20 54 68 65 6e 20 74 75 72 6e 20 69 6d 70 6f    Then turn impo
21740 73 74 65 72 20 6d 6f 64 65 20 62 61 63 6b 20 6f  ster mode back o
21750 66 66 20 61 67 61 69 6e 2e 0a 20 20 20 20 2a 2a  ff again..    **
21760 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f 66 66  .    ** If onOff
21770 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30 20 74  ==0 and tnum>0 t
21780 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 73 63  hen reset the sc
21790 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64 61 74  hema for all dat
217a0 61 62 61 73 65 73 2c 20 63 61 75 73 69 6e 67 0a  abases, causing.
217b0 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
217c0 61 20 74 6f 20 62 65 20 72 65 70 61 72 73 65 64  a to be reparsed
217d0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
217e0 74 20 69 73 20 6e 65 65 64 65 64 2e 20 20 54 68  t is needed.  Th
217f0 69 73 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a  is has the.    *
21800 2a 20 65 66 66 65 63 74 20 6f 66 20 65 72 61 73  * effect of eras
21810 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74 65 72  ing all imposter
21820 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a   tables..    */.
21830 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
21840 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
21850 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
21860 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
21870 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
21880 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
21890 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
218a0 65 78 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  ex);.      db->i
218b0 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c 69 74 65  nit.iDb = sqlite
218c0 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
218d0 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73 74 20  va_arg(ap,const 
218e0 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 64  char*));.      d
218f0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 64  b->init.busy = d
21900 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72  b->init.imposter
21910 54 61 62 6c 65 20 3d 20 76 61 5f 61 72 67 28 61  Table = va_arg(a
21920 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64 62  p,int);.      db
21930 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 3d  ->init.newTnum =
21940 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
21950 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 69  .      if( db->i
21960 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26 20 64  nit.busy==0 && d
21970 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e  b->init.newTnum>
21980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
21990 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
219a0 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
219b0 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
219c0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
219d0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
219e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
219f0 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
21a00 65 64 28 59 59 43 4f 56 45 52 41 47 45 29 0a 20  ed(YYCOVERAGE). 
21a10 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
21a20 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
21a30 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41 52 53  TE_TESTCTRL_PARS
21a40 45 52 5f 43 4f 56 45 52 41 47 45 2c 20 46 49 4c  ER_COVERAGE, FIL
21a50 45 20 2a 6f 75 74 29 0a 20 20 20 20 2a 2a 0a 20  E *out).    **. 
21a60 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
21a70 63 6f 6e 74 72 6f 6c 20 28 6f 6e 6c 79 20 61 76  control (only av
21a80 61 69 6c 61 62 6c 65 20 77 68 65 6e 20 53 51 4c  ailable when SQL
21a90 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
21aa0 77 69 74 68 0a 20 20 20 20 2a 2a 20 2d 44 59 59  with.    ** -DYY
21ab0 43 4f 56 45 52 41 47 45 29 20 77 72 69 74 65 73  COVERAGE) writes
21ac0 20 61 20 72 65 70 6f 72 74 20 6f 6e 74 6f 20 22   a report onto "
21ad0 6f 75 74 22 20 74 68 61 74 20 73 68 6f 77 73 20  out" that shows 
21ae0 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  all.    ** state
21af0 2f 6c 6f 6f 6b 61 68 65 61 64 20 63 6f 6d 62 69  /lookahead combi
21b00 6e 61 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 70  nations in the p
21b10 61 72 73 65 72 20 73 74 61 74 65 20 6d 61 63 68  arser state mach
21b20 69 6e 65 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  ine.    ** which
21b30 20 61 72 65 20 6e 65 76 65 72 20 65 78 65 72 63   are never exerc
21b40 69 73 65 64 2e 20 20 49 66 20 61 6e 79 20 73 74  ised.  If any st
21b50 61 74 65 20 69 73 20 6d 69 73 73 65 64 2c 20 6d  ate is missed, m
21b60 61 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ake the.    ** r
21b70 65 74 75 72 6e 20 63 6f 64 65 20 53 51 4c 49 54  eturn code SQLIT
21b80 45 5f 45 52 52 4f 52 2e 0a 20 20 20 20 2a 2f 0a  E_ERROR..    */.
21b90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
21ba0 54 45 53 54 43 54 52 4c 5f 50 41 52 53 45 52 5f  TESTCTRL_PARSER_
21bb0 43 4f 56 45 52 41 47 45 3a 20 7b 0a 20 20 20 20  COVERAGE: {.    
21bc0 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 76 61    FILE *out = va
21bd0 5f 61 72 67 28 61 70 2c 20 46 49 4c 45 2a 29 3b  _arg(ap, FILE*);
21be0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
21bf0 65 33 50 61 72 73 65 72 43 6f 76 65 72 61 67 65  e3ParserCoverage
21c00 28 6f 75 74 29 20 29 20 72 63 20 3d 20 53 51 4c  (out) ) rc = SQL
21c10 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
21c20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
21c30 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
21c40 59 59 43 4f 56 45 52 41 47 45 29 20 2a 2f 0a 20  YYCOVERAGE) */. 
21c50 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
21c60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
21c70 45 5f 55 4e 54 45 53 54 41 42 4c 45 20 2a 2f 0a  E_UNTESTABLE */.
21c80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21c90 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
21ca0 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c  utility routine,
21cb0 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69   useful to VFS i
21cc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20  mplementations, 
21cd0 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  that checks.** t
21ce0 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62  o see if a datab
21cf0 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55  ase file was a U
21d00 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65  RI that containe
21d10 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65  d a specific que
21d20 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ry .** parameter
21d30 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61  , and if so obta
21d40 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
21d50 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d   the query param
21d60 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
21d70 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
21d80 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61  nt is the filena
21d90 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  me pointer passe
21da0 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e  d into the xOpen
21db0 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
21dc0 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  a VFS implementa
21dd0 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61  tion.  The zPara
21de0 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  m argument is th
21df0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
21e00 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
21e10 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20   we seek.  This 
21e20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
21e30 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
21e40 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d   zParam.** param
21e50 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74  eter if it exist
21e60 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d  s.  If the param
21e70 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78  eter does not ex
21e80 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
21e90 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e  e.** returns a N
21ea0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
21eb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
21ec0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
21ed0 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  r(const char *zF
21ee0 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
21ef0 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20  har *zParam){.  
21f00 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
21f10 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20   || zParam==0 ) 
21f20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c  return 0;.  zFil
21f30 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
21f40 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
21f50 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  me) + 1;.  while
21f60 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ( zFilename[0] )
21f70 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74  {.    int x = st
21f80 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
21f90 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69  zParam);.    zFi
21fa0 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
21fb0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
21fc0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66  ame) + 1;.    if
21fd0 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( x==0 ) return 
21fe0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a  zFilename;.    z
21ff0 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
22000 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
22010 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a  ename) + 1;.  }.
22020 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
22030 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f  *.** Return a bo
22040 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20  olean value for 
22050 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
22060 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
22070 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f  3_uri_boolean(co
22080 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
22090 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
220a0 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66  *zParam, int bDf
220b0 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  lt){.  const cha
220c0 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
220d0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
220e0 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
220f0 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74  .  bDflt = bDflt
22100 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20  !=0;.  return z 
22110 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ? sqlite3GetBool
22120 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20  ean(z, bDflt) : 
22130 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bDflt;.}../*.** 
22140 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20  Return a 64-bit 
22150 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
22160 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
22170 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ter..*/.sqlite3_
22180 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72  int64 sqlite3_ur
22190 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74  i_int64(.  const
221a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
221b0 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ,    /* Filename
221c0 20 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f   as passed to xO
221d0 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  pen */.  const c
221e0 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20  har *zParam,    
221f0 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65     /* URI parame
22200 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20  ter sought */.  
22210 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44  sqlite3_int64 bD
22220 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74  flt       /* ret
22230 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72  urn if parameter
22240 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29   is missing */.)
22250 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
22260 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
22270 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e  parameter(zFilen
22280 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
22290 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b  sqlite3_int64 v;
222a0 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69  .  if( z && sqli
222b0 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
222c0 28 7a 2c 20 26 76 29 3d 3d 30 20 29 7b 0a 20 20  (z, &v)==0 ){.  
222d0 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d    bDflt = v;.  }
222e0 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b  .  return bDflt;
222f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22300 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74   the Btree point
22310 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  er identified by
22320 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72   zDbName.  Retur
22330 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
22340 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73  und..*/.Btree *s
22350 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
22360 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
22370 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
22380 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 44 62  Name){.  int iDb
22390 20 3d 20 7a 44 62 4e 61 6d 65 20 3f 20 73 71 6c   = zDbName ? sql
223a0 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
223b0 62 2c 20 7a 44 62 4e 61 6d 65 29 20 3a 20 30 3b  b, zDbName) : 0;
223c0 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3c 30 20  .  return iDb<0 
223d0 3f 20 30 20 3a 20 64 62 2d 3e 61 44 62 5b 69 44  ? 0 : db->aDb[iD
223e0 62 5d 2e 70 42 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  b].pBt;.}../*.**
223f0 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
22400 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
22410 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
22420 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a  with a database.
22430 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
22440 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
22450 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
22460 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
22470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
22480 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
22490 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
224a0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
224b0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
224c0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
224d0 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
224e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
224f0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
22500 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42  .  }.#endif.  pB
22510 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
22520 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
22530 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
22540 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
22550 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42  eeGetFilename(pB
22560 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  t) : 0;.}../*.**
22570 20 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74   Return 1 if dat
22580 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e  abase is read-on
22590 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f  ly or 0 if read/
225a0 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d  write.  Return -
225b0 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  1 if.** no such 
225c0 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e  database exists.
225d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
225e0 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69  db_readonly(sqli
225f0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
22600 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
22610 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66   Btree *pBt;.#if
22620 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
22630 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
22640 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
22650 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
22660 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
22670 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
22680 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
22690 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73  #endif.  pBt = s
226a0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
226b0 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
226c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
226d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52   sqlite3BtreeIsR
226e0 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20 2d  eadonly(pBt) : -
226f0 31 3b 0a 7d 0a 23 69 66 20 28 53 51 4c 49 54 45  1;.}.#if (SQLITE
22700 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
22710 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
22720 5f 5f 41 50 50 4c 45 5f 5f 29 0a 0a 23 69 6e 63  __APPLE__)..#inc
22730 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f 70 72  lude "sqlite3_pr
22740 69 76 61 74 65 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a  ivate.h"../* .**
22750 20 54 65 73 74 69 6e 67 20 61 20 66 69 6c 65 20   Testing a file 
22760 70 61 74 68 20 66 6f 72 20 73 71 6c 69 74 65 20  path for sqlite 
22770 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 61 20  locks held by a 
22780 70 72 6f 63 65 73 73 20 49 44 2e 20 0a 2a 2a 20  process ID. .** 
22790 52 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  Returns SQLITE_L
227a0 4f 43 4b 53 54 41 54 45 5f 4f 4e 20 69 66 20 6c  OCKSTATE_ON if l
227b0 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74  ocks are present
227c0 20 6f 6e 20 70 61 74 68 0a 2a 2a 20 74 68 61 74   on path.** that
227d0 20 77 6f 75 6c 64 20 70 72 65 76 65 6e 74 20 77   would prevent w
227e0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
227f0 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 5f  tabase..*/.int _
22800 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73 74 61 74  sqlite3_lockstat
22810 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  e(const char *pa
22820 74 68 2c 20 70 69 64 5f 74 20 70 69 64 29 7b 0a  th, pid_t pid){.
22830 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22840 4e 55 4c 4c 3b 0a 20 20 0a 20 20 69 66 28 20 73  NULL;.  .  if( s
22850 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70  qlite3_open_v2(p
22860 61 74 68 2c 20 26 64 62 2c 20 53 51 4c 49 54 45  ath, &db, SQLITE
22870 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20  _OPEN_READONLY, 
22880 4e 55 4c 4c 29 20 3d 3d 20 53 51 4c 49 54 45 5f  NULL) == SQLITE_
22890 4f 4b 20 29 7b 0a 20 20 20 20 4c 6f 63 6b 73 74  OK ){.    Lockst
228a0 61 74 65 50 49 44 20 6c 6f 63 6b 73 74 61 74 65  atePID lockstate
228b0 20 3d 20 7b 70 69 64 2c 20 2d 31 7d 3b 0a 20 20   = {pid, -1};.  
228c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
228d0 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
228e0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
228f0 43 4b 53 54 41 54 45 5f 50 49 44 2c 20 26 6c 6f  CKSTATE_PID, &lo
22900 63 6b 73 74 61 74 65 29 3b 0a 20 20 20 20 73 71  ckstate);.    sq
22910 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
22920 0a 20 20 20 20 69 6e 74 20 73 74 61 74 65 20 3d  .    int state =
22930 20 6c 6f 63 6b 73 74 61 74 65 2e 73 74 61 74 65   lockstate.state
22940 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 61  ;.    return sta
22950 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 55  te;.  }.  if( NU
22960 4c 4c 21 3d 64 62 20 29 7b 20 0a 20 20 20 20 73  LL!=db ){ .    s
22970 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
22980 3b 20 2f 2a 20 6e 65 65 64 20 74 6f 20 63 6c 6f  ; /* need to clo
22990 73 65 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 20  se even if open 
229a0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
229b0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
229c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
229d0 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 65 6e 64  E_ERROR;.}..#end
229e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
229f0 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 20 2a 2f  BLE_APPLE_SPI */
22a00 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22a10 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
22a20 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73  /*.** Obtain a s
22a30 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 66  napshot handle f
22a40 6f 72 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  or the snapshot 
22a50 6f 66 20 64 61 74 61 62 61 73 65 20 7a 44 62 20  of database zDb 
22a60 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65  currently .** be
22a70 69 6e 67 20 72 65 61 64 20 62 79 20 68 61 6e 64  ing read by hand
22a80 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
22a90 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
22aa0 65 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  et(.  sqlite3 *d
22ab0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
22ac0 20 2a 7a 44 62 2c 0a 20 20 73 71 6c 69 74 65 33   *zDb,.  sqlite3
22ad0 5f 73 6e 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e  _snapshot **ppSn
22ae0 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20  apshot.){.  int 
22af0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
22b00 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  R;.#ifndef SQLIT
22b10 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64  E_OMIT_WAL..#ifd
22b20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
22b30 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
22b40 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
22b50 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
22b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22b70 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
22b80 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
22b90 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
22ba0 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 66 28  ->mutex);..  if(
22bb0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
22bc0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44  =0 ){.    int iD
22bd0 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
22be0 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
22bf0 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c      if( iDb==0 |
22c00 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20  | iDb>1 ){.     
22c10 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
22c20 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
22c30 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
22c40 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
22c50 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
22c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
22c70 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
22c80 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
22c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22cc0 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28 73  gerSnapshotGet(s
22cd0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
22ce0 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68 6f  (pBt), ppSnapsho
22cf0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
22d00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22d10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
22d20 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
22d30 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
22d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
22d50 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
22d60 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72  ../*.** Open a r
22d70 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
22d80 6f 6e 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  on the snapshot 
22d90 69 64 65 6e 64 69 66 69 65 64 20 62 79 20 70 53  idendified by pS
22da0 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20  napshot..*/.int 
22db0 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
22dc0 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  _open(.  sqlite3
22dd0 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63   *db, .  const c
22de0 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73 71 6c  har *zDb, .  sql
22df0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
22e00 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e  Snapshot.){.  in
22e10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
22e20 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ROR;.#ifndef SQL
22e30 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69  ITE_OMIT_WAL..#i
22e40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
22e50 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
22e60 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
22e70 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
22e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22e90 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
22ea0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
22eb0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
22ec0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
22ed0 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
22ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
22ef0 44 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  Db;.    iDb = sq
22f00 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
22f10 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  db, zDb);.    if
22f20 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e  ( iDb==0 || iDb>
22f30 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  1 ){.      Btree
22f40 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
22f50 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
22f60 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
22f70 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d  IsInTrans(pBt)==
22f80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 50 61 67  0 ){.        Pag
22f90 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
22fa0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
22fb0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Bt);.        int
22fc0 20 62 55 6e 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   bUnlock = 0;.  
22fd0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22fe0 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
22ff0 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
23000 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56        if( db->nV
23010 64 62 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a  dbeActive==0 ){.
23020 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23030 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61   sqlite3PagerSna
23040 70 73 68 6f 74 43 68 65 63 6b 28 70 50 61 67 65  pshotCheck(pPage
23050 72 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  r, pSnapshot);. 
23060 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
23070 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 55                bU
23090 6e 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  nlock = 1;.     
230a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
230b0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
230c0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 20  (pBt);.         
230d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
230e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
230f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
23110 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23130 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23140 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
23150 73 68 6f 74 4f 70 65 6e 28 70 50 61 67 65 72 2c  shotOpen(pPager,
23160 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20   pSnapshot);.   
23170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23180 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
231a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
231b0 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30  eginTrans(pBt, 0
231c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
231d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
231e0 73 68 6f 74 4f 70 65 6e 28 70 50 61 67 65 72 2c  shotOpen(pPager,
231f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
23200 20 20 20 20 20 20 20 69 66 28 20 62 55 6e 6c 6f         if( bUnlo
23210 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
23220 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
23230 73 68 6f 74 55 6e 6c 6f 63 6b 28 70 50 61 67 65  shotUnlock(pPage
23240 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
23250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23260 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
23270 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
23280 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
23290 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
232a0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
232b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 20  ../*.** Recover 
232c0 61 73 20 6d 61 6e 79 20 73 6e 61 70 73 68 6f 74  as many snapshot
232d0 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  s as possible fr
232e0 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  om the wal file 
232f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
23300 2a 2a 20 73 63 68 65 6d 61 20 7a 44 62 20 6f 66  ** schema zDb of
23310 20 64 61 74 61 62 61 73 65 20 64 62 2e 0a 2a 2f   database db..*/
23320 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61  .int sqlite3_sna
23330 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 73 71  pshot_recover(sq
23340 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
23350 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69   char *zDb){.  i
23360 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
23370 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b  RROR;.  int iDb;
23380 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23390 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66  OMIT_WAL..#ifdef
233a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
233b0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
233c0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
233d0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
233e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
233f0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
23400 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
23410 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
23420 3e 6d 75 74 65 78 29 3b 0a 20 20 69 44 62 20 3d  >mutex);.  iDb =
23430 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
23440 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 69  me(db, zDb);.  i
23450 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62  f( iDb==0 || iDb
23460 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20  >1 ){.    Btree 
23470 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
23480 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  Db].pBt;.    if(
23490 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65   0==sqlite3Btree
234a0 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42  IsInReadTrans(pB
234b0 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
234c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
234d0 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20  inTrans(pBt, 0, 
234e0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
234f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23500 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23510 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
23520 52 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33 42  Recover(sqlite3B
23530 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
23540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23550 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29  BtreeCommit(pBt)
23560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23570 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
23580 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
23590 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f  tex);.#endif   /
235a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
235b0 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  L */.  return rc
235c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
235d0 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c  a snapshot handl
235e0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
235f0 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
23600 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  _get()..*/.void 
23610 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
23620 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 73 6e  _free(sqlite3_sn
23630 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
23640 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t){.  sqlite3_fr
23650 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d  ee(pSnapshot);.}
23660 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23670 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
23680 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
23690 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
236a0 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a 2f 2a  EOPTION_DIAGS./*
236b0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
236c0 6d 65 20 6f 66 20 61 20 63 6f 6d 70 69 6c 65 2d  me of a compile-
236d0 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 72 65 74  time option, ret
236e0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 61 74  urn true if that
236f0 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75   option.** was u
23700 73 65 64 20 61 6e 64 20 66 61 6c 73 65 20 69 66  sed and false if
23710 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   not..**.** The 
23720 6e 61 6d 65 20 63 61 6e 20 6f 70 74 69 6f 6e 61  name can optiona
23730 6c 6c 79 20 62 65 67 69 6e 20 77 69 74 68 20 22  lly begin with "
23740 53 51 4c 49 54 45 5f 22 20 62 75 74 20 74 68 65  SQLITE_" but the
23750 20 22 53 51 4c 49 54 45 5f 22 20 70 72 65 66 69   "SQLITE_" prefi
23760 78 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  x.** is not requ
23770 69 72 65 64 20 66 6f 72 20 61 20 6d 61 74 63 68  ired for a match
23780 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23790 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75  _compileoption_u
237a0 73 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sed(const char *
237b0 7a 4f 70 74 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  zOptName){.  int
237c0 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 70   i, n;.  int nOp
237d0 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
237e0 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a  **azCompileOpt;.
237f0 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
23800 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
23810 69 66 28 20 7a 4f 70 74 4e 61 6d 65 3d 3d 30 20  if( zOptName==0 
23820 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
23830 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
23840 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
23850 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 7a 43   }.#endif..  azC
23860 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69  ompileOpt = sqli
23870 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  te3CompileOption
23880 73 28 26 6e 4f 70 74 29 3b 0a 0a 20 20 69 66 28  s(&nOpt);..  if(
23890 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
238a0 28 7a 4f 70 74 4e 61 6d 65 2c 20 22 53 51 4c 49  (zOptName, "SQLI
238b0 54 45 5f 22 2c 20 37 29 3d 3d 30 20 29 20 7a 4f  TE_", 7)==0 ) zO
238c0 70 74 4e 61 6d 65 20 2b 3d 20 37 3b 0a 20 20 6e  ptName += 7;.  n
238d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
238e0 33 30 28 7a 4f 70 74 4e 61 6d 65 29 3b 0a 0a 20  30(zOptName);.. 
238f0 20 2f 2a 20 53 69 6e 63 65 20 6e 4f 70 74 20 69   /* Since nOpt i
23900 73 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e 20 73 69  s normally in si
23910 6e 67 6c 65 20 64 69 67 69 74 73 2c 20 61 20 6c  ngle digits, a l
23920 69 6e 65 61 72 20 73 65 61 72 63 68 20 69 73 20  inear search is 
23930 0a 20 20 2a 2a 20 61 64 65 71 75 61 74 65 2e 20  .  ** adequate. 
23940 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69  No need for a bi
23950 6e 61 72 79 20 73 65 61 72 63 68 2e 20 2a 2f 0a  nary search. */.
23960 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70    for(i=0; i<nOp
23970 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
23980 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
23990 28 7a 4f 70 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d  (zOptName, azCom
239a0 70 69 6c 65 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d  pileOpt[i], n)==
239b0 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
239c0 33 49 73 49 64 43 68 61 72 28 28 75 6e 73 69 67  3IsIdChar((unsig
239d0 6e 65 64 20 63 68 61 72 29 61 7a 43 6f 6d 70 69  ned char)azCompi
239e0 6c 65 4f 70 74 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a  leOpt[i][n])==0.
239f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
23a00 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
23a10 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23a20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
23a30 20 4e 2d 74 68 20 63 6f 6d 70 69 6c 65 2d 74 69   N-th compile-ti
23a40 6d 65 20 6f 70 74 69 6f 6e 20 73 74 72 69 6e 67  me option string
23a50 2e 20 20 49 66 20 4e 20 69 73 20 6f 75 74 20 6f  .  If N is out o
23a60 66 20 72 61 6e 67 65 2c 0a 2a 2a 20 72 65 74 75  f range,.** retu
23a70 72 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  rn a NULL pointe
23a80 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
23a90 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c   *sqlite3_compil
23aa0 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 6e 74 20  eoption_get(int 
23ab0 4e 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a  N){.  int nOpt;.
23ac0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
23ad0 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 20 61  zCompileOpt;.  a
23ae0 7a 43 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71  zCompileOpt = sq
23af0 6c 69 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69  lite3CompileOpti
23b00 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a 20 20 69 66  ons(&nOpt);.  if
23b10 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 6e 4f 70 74  ( N>=0 && N<nOpt
23b20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
23b30 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 4e 5d 3b 0a  zCompileOpt[N];.
23b40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
23b50 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
23b60 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
23b70 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a     PTION_DIAGS */.