/ Hex Artifact Content
Login

Artifact 5771725469dcb97667c647ebd8192073c925d13efdd46f94a84738187fa0a0bb:


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 23 69 6e 63 6c 75 64  teInt.h".#includ
0280: 65 20 22 6c 6f 6f 6b 61 73 69 64 65 2e 68 22 0a  e "lookaside.h".
0290: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
02a0: 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e 63  NABLE_FTS3.# inc
02b0: 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23 65  lude "fts3.h".#e
02c0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02d0: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
02e0: 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65 65  # include "rtree
02f0: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  .h".#endif.#if d
0300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0310: 41 42 4c 45 5f 49 43 55 29 20 7c 7c 20 64 65 66  ABLE_ICU) || def
0320: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0330: 4c 45 5f 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e  LE_ICU_COLLATION
0340: 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 22 73 71  S).# include "sq
0350: 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e 64 69  liteicu.h".#endi
0360: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
0370: 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 69 6e 74  ENABLE_JSON1.int
0380: 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69   sqlite3Json1Ini
0390: 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65 6e  t(sqlite3*);.#en
03a0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
03b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 56 54 41  E_ENABLE_STMTVTA
03c0: 42 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 74 6d  B.int sqlite3Stm
03d0: 74 56 74 61 62 49 6e 69 74 28 73 71 6c 69 74 65  tVtabInit(sqlite
03e0: 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  3*);.#endif.#ifd
03f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0400: 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69 74 65  _FTS5.int sqlite
0410: 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69 74 65  3Fts5Init(sqlite
0420: 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  3*);.#endif..#if
0430: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0440: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0450: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0460: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0470: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0480: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0490: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
04a0: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
04b0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
04c0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
04d0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
04e0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
04f0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
0500: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0510: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0520: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0530: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0540: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0550: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0560: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0570: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0580: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0590: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
05a0: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
05b0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
05c0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
05d0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
05e0: 46 3a 20 52 2d 32 35 30 36 33 2d 32 33 32 38 36  F: R-25063-23286
05f0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
0600: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0610: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0620: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0630: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0640: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0650: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0660: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0670: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0680: 72 6f 2e 20 45 78 63 65 70 74 20 69 66 20 53 51  ro. Except if SQ
0690: 4c 69 74 65 20 69 73 20 62 75 69 6c 74 20 75 73  Lite is built us
06a0: 69 6e 67 0a 2a 2a 20 61 6e 20 65 64 69 74 65 64  ing.** an edited
06b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 61 6d 61   copy of the ama
06c0: 6c 67 61 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20  lgamation, then 
06d0: 74 68 65 20 6c 61 73 74 20 66 6f 75 72 20 63 68  the last four ch
06e0: 61 72 61 63 74 65 72 73 20 6f 66 0a 2a 2a 20 74  aracters of.** t
06f0: 68 65 20 68 61 73 68 20 6d 69 67 68 74 20 62 65  he hash might be
0700: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
0710: 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44  SQLITE_SOURCE_ID
0720: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
0730: 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  *sqlite3_sourcei
0740: 64 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  d(void){ return 
0750: 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44  SQLITE_SOURCE_ID
0760: 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  ; }../* IMPLEMEN
0770: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 35 32  TATION-OF: R-352
0780: 31 30 2d 36 33 35 30 38 20 54 68 65 20 73 71 6c  10-63508 The sql
0790: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
07a0: 6e 75 6d 62 65 72 28 29 20 66 75 6e 63 74 69 6f  number() functio
07b0: 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  n.** returns an 
07c0: 69 6e 74 65 67 65 72 20 65 71 75 61 6c 20 74 6f  integer equal to
07d0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
07e0: 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e 74 20 73  NUMBER..*/.int s
07f0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
0800: 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64 29 7b 20  n_number(void){ 
0810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 56 45  return SQLITE_VE
0820: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a  RSION_NUMBER; }.
0830: 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  ./* IMPLEMENTATI
0840: 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39 30 2d 31  ON-OF: R-20790-1
0850: 34 30 32 35 20 54 68 65 20 73 71 6c 69 74 65 33  4025 The sqlite3
0860: 5f 74 68 72 65 61 64 73 61 66 65 28 29 20 66 75  _threadsafe() fu
0870: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
0880: 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64 20 6f 6e  * zero if and on
0890: 6c 79 20 69 66 20 53 51 4c 69 74 65 20 77 61 73  ly if SQLite was
08a0: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 6d   compiled with m
08b0: 75 74 65 78 69 6e 67 20 63 6f 64 65 20 6f 6d 69  utexing code omi
08c0: 74 74 65 64 20 64 75 65 20 74 6f 0a 2a 2a 20 74  tted due to.** t
08d0: 68 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  he SQLITE_THREAD
08e0: 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  SAFE compile-tim
08f0: 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e 67 20 73  e option being s
0900: 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20  et to 0..*/.int 
0910: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61  sqlite3_threadsa
0920: 66 65 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e  fe(void){ return
0930: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
0940: 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  FE; }../*.** Whe
0950: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20  n compiling the 
0960: 74 65 73 74 20 66 69 78 74 75 72 65 20 6f 72 20  test fixture or 
0970: 77 69 74 68 20 64 65 62 75 67 67 69 6e 67 20 65  with debugging e
0980: 6e 61 62 6c 65 64 20 28 6f 6e 20 57 69 6e 33 32  nabled (on Win32
0990: 29 2c 0a 2a 2a 20 74 68 69 73 20 76 61 72 69 61  ),.** this varia
09a0: 62 6c 65 20 62 65 69 6e 67 20 73 65 74 20 74 6f  ble being set to
09b0: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 6c 6c 20 63   non-zero will c
09c0: 61 75 73 65 20 4f 53 54 52 41 43 45 20 6d 61 63  ause OSTRACE mac
09d0: 72 6f 73 20 74 6f 20 65 6d 69 74 0a 2a 2a 20 65  ros to emit.** e
09e0: 78 74 72 61 20 64 69 61 67 6e 6f 73 74 69 63 20  xtra diagnostic 
09f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
0a00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
0a10: 56 45 5f 4f 53 5f 54 52 41 43 45 0a 23 20 69 66  VE_OS_TRACE.# if
0a20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
0a30: 47 5f 4f 53 5f 54 52 41 43 45 0a 23 20 20 20 64  G_OS_TRACE.#   d
0a40: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 42  efine SQLITE_DEB
0a50: 55 47 5f 4f 53 5f 54 52 41 43 45 20 30 0a 23 20  UG_OS_TRACE 0.# 
0a60: 65 6e 64 69 66 0a 20 20 69 6e 74 20 73 71 6c 69  endif.  int sqli
0a70: 74 65 33 4f 53 54 72 61 63 65 20 3d 20 53 51 4c  te3OSTrace = SQL
0a80: 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41  ITE_DEBUG_OS_TRA
0a90: 43 45 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  CE;.#endif..#if 
0aa0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0ab0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
0ac0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0ad0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
0ae0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0af0: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f  wing function po
0b00: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
0b10: 4c 20 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49  L and if.** SQLI
0b20: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
0b30: 45 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  E is enabled, th
0b40: 65 6e 20 6d 65 73 73 61 67 65 73 20 64 65 73 63  en messages desc
0b50: 72 69 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63  ribing.** I/O ac
0b60: 74 69 76 65 20 61 72 65 20 77 72 69 74 74 65 6e  tive are written
0b70: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
0b80: 74 69 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73  tion.  These mes
0b90: 73 61 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74  sages.** are int
0ba0: 65 6e 64 65 64 20 66 6f 72 20 64 65 62 75 67 67  ended for debugg
0bb0: 69 6e 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c  ing activity onl
0bc0: 79 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 41 50 49  y..*/.SQLITE_API
0bd0: 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44   void (SQLITE_CD
0be0: 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72  ECL *sqlite3IoTr
0bf0: 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ace)(const char*
0c00: 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64  , ...) = 0;.#end
0c10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
0c20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
0c30: 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  l variable point
0c40: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68  s to a string wh
0c50: 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61  ich is the.** na
0c60: 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
0c70: 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72  y, then that dir
0c80: 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75  ectory will be u
0c90: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
0ca0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
0cb0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0cc0: 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70  the "PRAGMA temp
0cd0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0ce0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0cf0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0d00: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
0d10: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   0;../*.** If th
0d20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
0d30: 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  al variable poin
0d40: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77  ts to a string w
0d50: 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e  hich is the.** n
0d60: 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
0d70: 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69  ry, then that di
0d80: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
0d90: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
0da0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
0db0: 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69  les specified wi
0dc0: 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
0dd0: 74 68 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  thname..**.** Se
0de0: 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47  e also the "PRAG
0df0: 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  MA data_store_di
0e00: 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d  rectory" SQL com
0e10: 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  mand..*/.char *s
0e20: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
0e30: 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  ctory = 0;../*.*
0e40: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c  * Initialize SQL
0e50: 69 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  ite.  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
0e70: 65 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74  e called to init
0e80: 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
0e90: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a  y allocation,.**
0ea0: 20 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20   VFS, and mutex 
0eb0: 73 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72  subsystems prior
0ec0: 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65   to doing any se
0ed0: 72 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a  rious work with.
0ee0: 2a 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20  ** SQLite.  But 
0ef0: 61 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64  as long as you d
0f00: 6f 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69  o not compile wi
0f10: 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  th SQLITE_OMIT_A
0f20: 55 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20  UTOINIT.** this 
0f30: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
0f40: 63 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63  called automatic
0f50: 61 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74  ally by key rout
0f60: 69 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20  ines such as.** 
0f70: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20  sqlite3_open(). 
0f80: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
0f90: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
0fa0: 65 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65  except on its ve
0fb0: 72 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f  ry first call fo
0fc0: 72 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a  r the process,.*
0fd0: 2a 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72  * or for the fir
0fe0: 73 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20  st call after a 
0ff0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
1000: 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20  shutdown..**.** 
1010: 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  The first thread
1020: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f   to call this ro
1030: 75 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69  utine runs the i
1040: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f  nitialization to
1050: 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20  .** completion. 
1060: 20 49 66 20 73 75 62 73 65 71 75 65 6e 74 20 74   If subsequent t
1070: 68 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73  hreads call this
1080: 20 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20   routine before 
1090: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72  the first.** thr
10a0: 65 61 64 20 68 61 73 20 66 69 6e 69 73 68 65 64  ead has finished
10b0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
10c0: 69 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ion process, the
10d0: 6e 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  n the subsequent
10e0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74  .** threads must
10f0: 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65   block until the
1100: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 66 69   first thread fi
1110: 6e 69 73 68 65 73 20 77 69 74 68 20 74 68 65 20  nishes with the 
1120: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
1130: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1140: 74 68 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c  thread might cal
1150: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1160: 65 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63  ecursively.  Rec
1170: 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20  ursive.** calls 
1180: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1190: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b  should not block
11a0: 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74  , of course.  Ot
11b0: 68 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69  herwise the.** i
11c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
11d0: 6f 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65  ocess would neve
11e0: 72 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a  r complete..**.*
11f0: 2a 20 4c 65 74 20 58 20 62 65 20 74 68 65 20 66  * Let X be the f
1200: 69 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 65  irst thread to e
1210: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
1220: 65 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d  e.  Let Y be som
1230: 65 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61  e other.** threa
1240: 64 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74  d.  Then while t
1250: 68 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63  he initial invoc
1260: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f  ation of this ro
1270: 75 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a  utine by X is.**
1280: 20 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20   incomplete, it 
1290: 69 73 20 72 65 71 75 69 72 65 64 20 74 68 61 74  is required that
12a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61  :.**.**    *  Ca
12b0: 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  lls to this rout
12c0: 69 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20  ine from Y must 
12d0: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  block until the 
12e0: 6f 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20  outer-most.**   
12f0: 20 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f      call by X co
1300: 6d 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  mpletes..**.**  
1310: 20 20 2a 20 20 52 65 63 75 72 73 69 76 65 20 63    *  Recursive c
1320: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1330: 74 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64  tine from thread
1340: 20 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69   X return immedi
1350: 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77  ately.**       w
1360: 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e  ithout blocking.
1370: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1380: 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29  initialize(void)
1390: 7b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  {.  MUTEX_LOGIC(
13a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
13b0: 70 4d 61 73 74 65 72 3b 20 29 20 20 20 20 20 20  pMaster; )      
13c0: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61   /* The main sta
13d0: 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69  tic mutex */.  i
13e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1410: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 23 69  esult code */.#i
1420: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
1430: 41 5f 49 4e 49 54 0a 20 20 69 6e 74 20 62 52 75  A_INIT.  int bRu
1440: 6e 45 78 74 72 61 49 6e 69 74 20 3d 20 30 3b 20  nExtraInit = 0; 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 69        /* Extra i
1470: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6e 65  nitialization ne
1480: 65 64 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  eded */.#endif..
1490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
14a0: 49 54 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71  IT_WSD.  rc = sq
14b0: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
14c0: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
14d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1500: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
1510: 67 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  g assert() fails
1520: 20 6f 6e 20 73 6f 6d 65 20 6f 62 73 63 75 72 65   on some obscure
1530: 20 70 72 6f 63 65 73 73 6f 72 2f 63 6f 6d 70 69   processor/compi
1540: 6c 65 72 0a 20 20 2a 2a 20 63 6f 6d 62 69 6e 61  ler.  ** combina
1550: 74 69 6f 6e 2c 20 74 68 65 20 77 6f 72 6b 2d 61  tion, the work-a
1560: 72 6f 75 6e 64 20 69 73 20 74 6f 20 73 65 74 20  round is to set 
1570: 74 68 65 20 63 6f 72 72 65 63 74 20 70 6f 69 6e  the correct poin
1580: 74 65 72 0a 20 20 2a 2a 20 73 69 7a 65 20 61 74  ter.  ** size at
1590: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
15a0: 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 50 54 52  ing -DSQLITE_PTR
15b0: 53 49 5a 45 3d 6e 20 63 6f 6d 70 69 6c 65 2d 74  SIZE=n compile-t
15c0: 69 6d 65 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ime option */.  
15d0: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 50  assert( SQLITE_P
15e0: 54 52 53 49 5a 45 3d 3d 73 69 7a 65 6f 66 28 63  TRSIZE==sizeof(c
15f0: 68 61 72 2a 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  har*) );..  /* I
1600: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
1610: 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  ady completely i
1620: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
1630: 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20   this call.  ** 
1640: 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  to sqlite3_initi
1650: 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62  alize() should b
1660: 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  e a no-op.  But 
1670: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1680: 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  on.  ** must be 
1690: 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73  complete.  So is
16a0: 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65  Init must not be
16b0: 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76   set until the v
16c0: 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ery end.  ** of 
16d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20  this routine..  
16e0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
16f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1700: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
1710: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61  ITE_OK;..  /* Ma
1720: 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75 74 65  ke sure the mute
1730: 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69  x subsystem is i
1740: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20  nitialized.  If 
1750: 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20  unable to .  ** 
1760: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
1770: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20  utex subsystem, 
1780: 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74  return early wit
1790: 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a  h the error..  *
17a0: 2a 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20  * If the system 
17b0: 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20  is so sick that 
17c0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
17d0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65   allocate a mute
17e0: 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  x,.  ** there is
17f0: 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65   not much SQLite
1800: 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20   is going to be 
1810: 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a  able to do..  **
1820: 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  .  ** The mutex 
1830: 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74  subsystem must t
1840: 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72 69  ake care of seri
1850: 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a  alizing its own.
1860: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74    ** initializat
1870: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
1880: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69   sqlite3MutexIni
1890: 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  t();.  if( rc ) 
18a0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
18b0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
18c0: 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20  malloc() system 
18d0: 61 6e 64 20 74 68 65 20 72 65 63 75 72 73 69 76  and the recursiv
18e0: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
18f0: 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70  ex..  ** This op
1900: 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65  eration is prote
1910: 63 74 65 64 20 62 79 20 74 68 65 20 53 54 41 54  cted by the STAT
1920: 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e  IC_MASTER mutex.
1930: 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a    Note that.  **
1940: 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73   MutexAlloc() is
1950: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74   called for a st
1960: 61 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72  atic mutex prior
1970: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   to initializing
1980: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   the.  ** malloc
1990: 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69   subsystem - thi
19a0: 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
19b0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  he allocation of
19c0: 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d   a static.  ** m
19d0: 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65  utex must not re
19e0: 71 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72  quire support fr
19f0: 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75  om the malloc su
1a00: 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20  bsystem..  */.  
1a10: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61  MUTEX_LOGIC( pMa
1a20: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
1a30: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1a40: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
1a50: 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  TER); ).  sqlite
1a60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
1a70: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
1a80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1a90: 4d 75 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20  MutexInit = 1;. 
1aa0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1ab0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
1ac0: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  ocInit ){.    rc
1ad0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1ae0: 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66  Init();.  }.  if
1af0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
1b10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
1b20: 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  locInit = 1;.   
1b30: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1b40: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1b50: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71  utex ){.      sq
1b60: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b70: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20  g.pInitMutex =. 
1b80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b90: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1ba0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1bb0: 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  VE);.      if( s
1bc0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1bd0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26  ig.bCoreMutex &&
1be0: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1bf0: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c10: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1c20: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1c30: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c50: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1c60: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1c70: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1c80: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c90: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1ca0: 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c  If rc is not SQL
1cb0: 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70  ITE_OK at this p
1cc0: 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65  oint, then eithe
1cd0: 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  r the malloc.  *
1ce0: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c  * subsystem coul
1cf0: 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  d not be initial
1d00: 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79 73 74  ized or the syst
1d10: 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c  em failed to all
1d20: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
1d30: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1d40: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1d50: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
1d60: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1d70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1d90: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1da0: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1db0: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1dc0: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1dd0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
1de0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1df0: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
1e00: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
1e10: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1e20: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
1e30: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1e40: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1e50: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1e60: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1e70: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1e80: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1e90: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1ea0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1eb0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1ec0: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  ossible..  **.  
1ed0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1ee0: 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37  N-OF: R-00140-37
1ef0: 34 34 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  445 SQLite autom
1f00: 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69  atically seriali
1f10: 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  zes calls.  ** t
1f20: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1f30: 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74  od, so the xInit
1f40: 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74   method need not
1f50: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a   be threadsafe..
1f60: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
1f70: 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73  llowing mutex is
1f80: 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   what serializes
1f90: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 61   access to the a
1fa0: 70 70 64 65 66 20 70 63 61 63 68 65 20 78 49 6e  ppdef pcache xIn
1fb0: 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e  it.  ** methods.
1fc0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63    The sqlite3_pc
1fd0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e  ache_methods.xIn
1fe0: 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65  it() all is embe
1ff0: 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  dded in the.  **
2000: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2010: 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65  PcacheInitialize
2020: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
2030: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
2040: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2050: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
2060: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2070: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
2080: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
2090: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
20a0: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
20b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
20c0: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d  fig.inProgress =
20d0: 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
20e0: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
20f0: 20 20 20 20 7b 0a 20 20 20 20 20 20 65 78 74 65      {.      exte
2100: 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  rn void sqlite3_
2110: 69 6e 69 74 5f 73 71 6c 6c 6f 67 28 76 6f 69 64  init_sqllog(void
2120: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2130: 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67 28 29 3b 0a  _init_sqllog();.
2140: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2150: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
2160: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
2170: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
2180: 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  te3BuiltinFuncti
2190: 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ons));.    sqlit
21a0: 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
21b0: 6e 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20  nFunctions();.  
21c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
21d0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
21e0: 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  heInit==0 ){.   
21f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2200: 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28  cacheInitialize(
2210: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2220: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2230: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
2240: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2250: 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20  acheInit = 1;.  
2260: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2270: 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a  OsInit();.    }.
2280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2290: 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
22a0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 64  rc = sqlite3Memd
22d0: 62 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 23  bInit();.    }.#
22e0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
22f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2300: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
2310: 68 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73  heBufferSetup( s
2320: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2330: 69 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20  ig.pPage, .     
2340: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2350: 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c  alConfig.szPage,
2360: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2370: 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20  nfig.nPage);.   
2380: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2390: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20  Config.isInit = 
23a0: 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
23b0: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20  _EXTRA_INIT.    
23c0: 20 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20    bRunExtraInit 
23d0: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 1;.#endif.    
23e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  }.    sqlite3Glo
23f0: 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67  balConfig.inProg
2400: 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ress = 0;.  }.  
2410: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2420: 61 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ave(sqlite3Globa
2430: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
2440: 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61  ex);..  /* Go ba
2450: 63 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61  ck under the sta
2460: 74 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c  tic mutex and cl
2470: 65 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72  ean up the recur
2480: 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20  sive.  ** mutex 
2490: 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73  to prevent a res
24a0: 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f  ource leak..  */
24b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
24c0: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
24d0: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
24e0: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
24f0: 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71  utex--;.  if( sq
2500: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2510: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c  g.nRefInitMutex<
2520: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
2530: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2540: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2550: 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
2560: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
2570: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
2580: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
2590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
25a0: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
25b0: 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  utex = 0;.  }.  
25c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
25d0: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20  ave(pMaster);.. 
25e0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
25f0: 67 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69  g is just a sani
2600: 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ty check to make
2610: 20 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73   sure SQLite has
2620: 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69  .  ** been compi
2630: 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  led correctly.  
2640: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2650: 74 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  to run this code
2660: 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f  , but.  ** we do
2670: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20  n't want to run 
2680: 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64  it too often and
2690: 20 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63   soak up CPU cyc
26a0: 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20  les for no.  ** 
26b0: 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72  reason.  So we r
26c0: 75 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e  un it once durin
26d0: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
26e0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
26f0: 44 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51  DEBUG.#ifndef SQ
2700: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
2710: 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68  NG_POINT.  /* Th
2720: 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f  is section of co
2730: 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75  de's only "outpu
2740: 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74  t" is via assert
2750: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a  () statements. *
2760: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2770: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34  TE_OK ){.    u64
2780: 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c   x = (((u64)1)<<
2790: 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c  63)-1;.    doubl
27a0: 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e y;.    assert(
27b0: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20  sizeof(x)==8);. 
27c0: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
27d0: 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b  (x)==sizeof(y));
27e0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20  .    memcpy(&y, 
27f0: 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65  &x, 8);.    asse
2800: 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  rt( sqlite3IsNaN
2810: 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (y) );.  }.#endi
2820: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  f.#endif..  /* D
2830: 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  o extra initiali
2840: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71  zation steps req
2850: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51  uested by the SQ
2860: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
2870: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
2880: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  e option..  */.#
2890: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
28a0: 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52  RA_INIT.  if( bR
28b0: 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20  unExtraInit ){. 
28c0: 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58     int SQLITE_EX
28d0: 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63  TRA_INIT(const c
28e0: 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  har*);.    rc = 
28f0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2900: 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  T(0);.  }.#endif
2910: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2920: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65  ../*.** Undo the
2930: 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69   effects of sqli
2940: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
2950: 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63  .  Must not be c
2960: 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74  alled while.** t
2970: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
2980: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ding database co
2990: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
29a0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
29b0: 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20  or.** while any 
29c0: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69  part of SQLite i
29d0: 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  s otherwise in u
29e0: 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64  se in any thread
29f0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2a00: 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  ne is not thread
2a10: 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73  safe.  But it is
2a20: 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20   safe to invoke 
2a30: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2a40: 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  on when SQLite i
2a50: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
2a60: 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20  own.  If SQLite 
2a70: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
2a80: 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  down.** when thi
2a90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
2aa0: 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  oked, then this 
2ab0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2ac0: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2ad0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
2ae0: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64  down(void){.#ifd
2af0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2b00: 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  SD.  int rc = sq
2b10: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
2b20: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
2b30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b40: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2b50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2b60: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2b70: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a  onfig.isInit ){.
2b80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2b90: 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20  TRA_SHUTDOWN.   
2ba0: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54   void SQLITE_EXT
2bb0: 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64  RA_SHUTDOWN(void
2bc0: 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58  );.    SQLITE_EX
2bd0: 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a  TRA_SHUTDOWN();.
2be0: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2bf0: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
2c00: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
2c10: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
2c20: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2c30: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2c40: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2c50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c60: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2c70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2c80: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2c90: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2ca0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2cb0: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2cc0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2cd0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2ce0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2cf0: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
2d00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2d10: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2d20: 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  Init = 0;..#ifnd
2d30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2d40: 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52  HUTDOWN_DIRECTOR
2d50: 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68  IES.    /* The h
2d60: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61  eap subsystem ha
2d70: 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64  s now been shutd
2d80: 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61  own and these va
2d90: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2da0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e  d.    ** to be N
2db0: 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20  ULL or point to 
2dc0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2dd0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2de0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a  lite3_malloc(),.
2df0: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2e00: 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20  ld rely on that 
2e10: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20  heap subsystem; 
2e20: 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20  therefore, make 
2e30: 73 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a  sure these.    *
2e40: 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20  * values cannot 
2e50: 72 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65  refer to heap me
2e60: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75  mory that was ju
2e70: 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  st invalidated w
2e80: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68  hen the.    ** h
2e90: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61  eap subsystem wa
2ea0: 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  s shutdown.  Thi
2eb0: 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69  s is only done i
2ec0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  f the current ca
2ed0: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ll to.    ** thi
2ee0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  s function resul
2ef0: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20  ted in the heap 
2f00: 73 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c  subsystem actual
2f10: 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77  ly being shutdow
2f20: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  n..    */.    sq
2f30: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2f40: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tory = 0;.    sq
2f50: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2f60: 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tory = 0;.#endif
2f70: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2f80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2f90: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2fa0: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2fb0: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2fc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2fd0: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
2fe0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2ff0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3000: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
3010: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
3020: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
3030: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
3040: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
3050: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
3060: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
3070: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
3080: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
3090: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
30a0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
30b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
30c0: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
30d0: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
30e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
30f0: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
3100: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
3110: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
3120: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
3130: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
3140: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
3150: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
3160: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
3170: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
3180: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
3190: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
31a0: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
31b0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
31c0: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
31d0: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
31e0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
31f0: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
3200: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3210: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
3220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
3230: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
3240: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
3250: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
3260: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
3270: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
3280: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
3290: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
32a0: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
32b0: 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23  ompile..    */.#
32c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
32d0: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
32e0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
32f0: 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  FE>0  /* IMP: R-
3300: 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20  54466-46756 */. 
3310: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3320: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
3330: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AD: {.      /* E
3340: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
3350: 37 34 38 2d 31 39 30 39 36 20 54 68 69 73 20 6f  748-19096 This o
3360: 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74  ption sets the t
3370: 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f  hreading mode to
3380: 0a 20 20 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65  .      ** Single
3390: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
33a0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33b0: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
33c0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
33d0: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
33e0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
33f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3400: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3410: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3420: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
3430: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3440: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
3450: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
3460: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
3470: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
3480: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32 30   /* IMP: R-20520
3490: 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63 61  -54086 */.    ca
34a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
34b0: 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a  _MULTITHREAD: {.
34c0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
34d0: 45 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d 34 32  E-OF: R-14374-42
34e0: 34 36 38 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  468 This option 
34f0: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3500: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3510: 20 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64   ** Multi-thread
3520: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3530: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3540: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20  CoreMutex = 1;  
3550: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
3560: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
3570: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3580: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
3590: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
35a0: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
35b0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
35c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
35d0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
35e0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
35f0: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3600: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3610: 20 52 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a   R-59593-21810 *
3620: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
3630: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
3640: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
3650: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
3660: 31 32 32 30 2d 35 31 38 30 30 20 54 68 69 73 20  1220-51800 This 
3670: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
3680: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
3690: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 65 72 69 61  o.      ** Seria
36a0: 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lized. */.      
36b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
36c0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
36d0: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
36e0: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
36f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3700: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
3710: 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e  utex = 1;  /* En
3720: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
3730: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
3740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3750: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
3760: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
3770: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
3780: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3790: 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34 38 37  IMP: R-63666-487
37a0: 35 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  55 */.    case S
37b0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
37c0: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EX: {.      /* S
37d0: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
37e0: 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c  ative mutex impl
37f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3800: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3810: 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20  lConfig.mutex = 
3820: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3830: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
3840: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
3850: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
3860: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3870: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3880: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3890: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  FE>0 /* IMP: R-1
38a0: 34 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20  4450-37597 */.  
38b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
38c0: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
38d0: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
38e0: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
38f0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
3900: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
3910: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3920: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
3930: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
3940: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20  Config.mutex;.  
3950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3960: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
3970: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3980: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
3990: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
39a0: 52 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68  R-55594-21030 Th
39b0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
39c0: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
39d0: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
39e0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
39f0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3a00: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3a10: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3a20: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3a30: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3a40: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65  The argument spe
3a50: 63 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69  cifies alternati
3a60: 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d  ve.      ** low-
3a70: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
3a80: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3a90: 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70   to be used in p
3aa0: 6c 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  lace of the memo
3ab0: 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ry.      ** allo
3ac0: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3ad0: 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74  built into SQLit
3ae0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
3af0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3b00: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3b10: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3b20: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
3b30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3b40: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3b50: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
3b60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3b70: 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31  OF: R-51213-4641
3b80: 34 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  4 The SQLITE_CON
3b90: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70  FIG_GETMALLOC op
3ba0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3bb0: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3bc0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
3bd0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3be0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
3bf0: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
3c00: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3c10: 63 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74  cture. The sqlit
3c20: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3c30: 74 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20  tructure is.    
3c40: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
3c50: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
3c60: 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c  efined memory al
3c70: 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  location routine
3c80: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  s. */.      if( 
3c90: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3ca0: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30  fig.m.xMalloc==0
3cb0: 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74   ) sqlite3MemSet
3cc0: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3cd0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3ce0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3cf0: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3d00: 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20  alConfig.m;.    
3d10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3d20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3d30: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
3d40: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3d50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35  ENCE-OF: R-61275
3d60: 2d 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54  -35157 The SQLIT
3d70: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
3d80: 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a  US option takes.
3d90: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3da0: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65  argument of type
3db0: 20 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65   int, interprete
3dc0: 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20  d as a boolean, 
3dd0: 77 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20  which enables.  
3de0: 20 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c      ** or disabl
3df0: 65 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f  es the collectio
3e00: 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  n of memory allo
3e10: 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  cation statistic
3e20: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
3e30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3e40: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
3e50: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3e60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3e70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3e80: 4f 4e 46 49 47 5f 53 4d 41 4c 4c 5f 4d 41 4c 4c  ONFIG_SMALL_MALL
3e90: 4f 43 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OC: {.      sqli
3ea0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3eb0: 62 53 6d 61 6c 6c 4d 61 6c 6c 6f 63 20 3d 20 76  bSmallMalloc = v
3ec0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3ed0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3ee0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3ef0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
3f00: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
3f10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
3f20: 38 37 36 31 2d 33 36 36 30 31 20 54 68 65 72 65  8761-36601 There
3f30: 20 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d   are three argum
3f40: 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ents to.      **
3f50: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3f60: 41 47 45 43 41 43 48 45 3a 20 41 20 70 6f 69 6e  AGECACHE: A poin
3f70: 74 65 72 20 74 6f 20 38 2d 62 79 74 65 20 61 6c  ter to 8-byte al
3f80: 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 28 70 4d  igned memory (pM
3f90: 65 6d 29 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  em),.      ** th
3fa0: 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68 20 70  e size of each p
3fb0: 61 67 65 20 63 61 63 68 65 20 6c 69 6e 65 20 28  age cache line (
3fc0: 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d  sz), and the num
3fd0: 62 65 72 20 6f 66 20 63 61 63 68 65 20 6c 69 6e  ber of cache lin
3fe0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 28 4e 29 2e  es.      ** (N).
3ff0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
4000: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
4010: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
4020: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
4030: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4040: 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61  ig.szPage = va_a
4050: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4060: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4070: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76  Config.nPage = v
4080: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
40a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
40b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
40c0: 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20  _HDRSZ: {.      
40d0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
40e0: 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68  R-39100-27317 Th
40f0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4100: 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74  PCACHE_HDRSZ opt
4110: 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20  ion takes.      
4120: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61  ** a single para
4130: 6d 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61  meter which is a
4140: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
4150: 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65  nteger and write
4160: 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  s into.      ** 
4170: 74 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65  that integer the
4180: 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   number of extra
4190: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
41a0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
41b0: 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  h page.      ** 
41c0: 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  in SQLITE_CONFIG
41d0: 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20  _PAGECACHE. */. 
41e0: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
41f0: 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20   int*) = .      
4200: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4210: 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20  rSizeBtree() +. 
4220: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4230: 48 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65  HeaderSizePcache
4240: 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73  () +.          s
4250: 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65  qlite3HeaderSize
4260: 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20  Pcache1();.     
4270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4280: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4290: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
42a0: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
42b0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
42c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
42d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
42e0: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
42f0: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
4300: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
4310: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
4320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4330: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4340: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
4350: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
4360: 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34  CE-OF: R-63325-4
4370: 38 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f  8378 The SQLITE_
4380: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f  CONFIG_PCACHE2 o
4390: 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20  ption takes a.  
43a0: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72      ** single ar
43b0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
43c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
43d0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
43e0: 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a  ethods2.      **
43f0: 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62   object. This ob
4400: 6a 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74  ject specifies t
4410: 68 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  he interface to 
4420: 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61  a custom page ca
4430: 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  che.      ** imp
4440: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  lementation. */.
4450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4460: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
4470: 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  2 = *va_arg(ap, 
4480: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
4490: 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20  ethods2*);.     
44a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
44b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
44c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a  NFIG_GETPCACHE2:
44d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
44e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35  ENCE-OF: R-22035
44f0: 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54  -46182 The SQLIT
4500: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43  E_CONFIG_GETPCAC
4510: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
4520: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
4530: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
4540: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
4550: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
4560: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
4570: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51     ** object. SQ
4580: 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Lite copies of t
4590: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
45a0: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
45b0: 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20  tion into.      
45c0: 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20  ** that object. 
45d0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
45e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
45f0: 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d  .pcache2.xInit==
4600: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
4610: 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66  ite3PCacheSetDef
4620: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a  ault();.      }.
4630: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
4640: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
4650: 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71  _methods2*) = sq
4660: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4670: 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20  g.pcache2;.     
4680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f   break;.    }../
4690: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
46a0: 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65  -06626-12911 The
46b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
46c0: 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e  EAP option is on
46d0: 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ly.** available 
46e0: 69 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  if SQLite is com
46f0: 70 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65  piled with eithe
4700: 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  r SQLITE_ENABLE_
4710: 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51  MEMSYS3 or.** SQ
4720: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
4730: 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20  YS5 and returns 
4740: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
4750: 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73  invoked otherwis
4760: 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e. */.#if define
4770: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
4780: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
4790: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
47a0: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
47b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
47c0: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
47d0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
47e0: 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68  R-19854-42126 Th
47f0: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72  ere are three ar
4800: 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20  guments to.     
4810: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
4820: 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74  G_HEAP: An 8-byt
4830: 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65  e aligned pointe
4840: 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c  r to the memory,
4850: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75   the.      ** nu
4860: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
4870: 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66   the memory buff
4880: 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69  er, and the mini
4890: 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  mum allocation s
48a0: 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
48b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
48c0: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20  lConfig.pHeap = 
48d0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
48e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
48f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
4900: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
4910: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4930: 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61  mnReq = va_arg(a
4940: 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20  p, int);..      
4950: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4960: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20  lConfig.mnReq<1 
4970: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4990: 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  nReq = 1;.      
49a0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
49b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
49c0: 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20  Req>(1<<12) ){. 
49d0: 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69         /* cap mi
49e0: 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61  n request size a
49f0: 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20  t 2^12 */.      
4a00: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4a10: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31  onfig.mnReq = (1
4a20: 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  <<12);.      }..
4a30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4a40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
4a50: 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eap==0 ){.      
4a60: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4a70: 3a 20 52 2d 34 39 39 32 30 2d 36 30 31 38 39 20  : R-49920-60189 
4a80: 49 66 20 74 68 65 20 66 69 72 73 74 20 70 6f 69  If the first poi
4a90: 6e 74 65 72 20 28 74 68 65 20 6d 65 6d 6f 72 79  nter (the memory
4aa0: 20 70 6f 69 6e 74 65 72 29 0a 20 20 20 20 20 20   pointer).      
4ab0: 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68    ** is NULL, th
4ac0: 65 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72 74  en SQLite revert
4ad0: 73 20 74 6f 20 75 73 69 6e 67 20 69 74 73 20 64  s to using its d
4ae0: 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c  efault memory al
4af0: 6c 6f 63 61 74 6f 72 0a 20 20 20 20 20 20 20 20  locator.        
4b00: 2a 2a 20 28 74 68 65 20 73 79 73 74 65 6d 20 6d  ** (the system m
4b10: 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e  alloc() implemen
4b20: 74 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67  tation), undoing
4b30: 20 61 6e 79 20 70 72 69 6f 72 20 69 6e 76 6f 63   any prior invoc
4b40: 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 20  ation of.       
4b50: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
4b60: 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20 20 20  G_MALLOC..      
4b70: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
4b80: 53 65 74 74 69 6e 67 20 73 71 6c 69 74 65 33 47  Setting sqlite3G
4b90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f  lobalConfig.m to
4ba0: 20 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c 6c 20   all zeros will 
4bb0: 63 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a  cause malloc to.
4bc0: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 76 65 72          ** rever
4bd0: 74 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74  t to its default
4be0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
4bf0: 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69  when sqlite3_ini
4c00: 74 69 61 6c 69 7a 65 28 29 20 69 73 20 72 75 6e  tialize() is run
4c10: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
4c20: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69      memset(&sqli
4c30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4c40: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c  m, 0, sizeof(sql
4c50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4c60: 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  .m));.      }els
4c70: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
4c80: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 30  IDENCE-OF: R-610
4c90: 30 36 2d 30 38 39 31 38 20 49 66 20 74 68 65 20  06-08918 If the 
4ca0: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 69  memory pointer i
4cb0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4cc0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  the.        ** a
4cd0: 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72  lternative memor
4ce0: 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65  y allocator is e
4cf0: 6e 67 61 67 65 64 20 74 6f 20 68 61 6e 64 6c 65  ngaged to handle
4d00: 20 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65 73 0a   all of SQLites.
4d10: 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 6f 72          ** memor
4d20: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65  y allocation nee
4d30: 64 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ds. */.#ifdef SQ
4d40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
4d50: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
4d60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4d70: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
4d80: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
4d90: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4da0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
4db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4dc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
4dd0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
4de0: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
4df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4e00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4e10: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
4e20: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
4e30: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
4e40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4e50: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
4e60: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e80: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
4e90: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
4ea0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4eb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4ec0: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61  .    /* Record a
4ed0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4ee0: 6c 6f 67 67 65 72 20 66 75 6e 63 74 69 6f 6e 20  logger function 
4ef0: 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72  and its first ar
4f00: 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54  gument..    ** T
4f10: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55  he default is NU
4f20: 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20  LL.  Logging is 
4f30: 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20  disabled if the 
4f40: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
4f50: 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e   is.    ** NULL.
4f60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4f70: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
4f80: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d  OG: {.      /* M
4f90: 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f  SVC is picky abo
4fa0: 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20  ut pulling func 
4fb0: 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73  ptrs from va lis
4fc0: 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74  ts..      ** htt
4fd0: 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72  p://support.micr
4fe0: 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39  osoft.com/kb/479
4ff0: 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  61.      ** sqli
5000: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5010: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
5020: 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c  , void(*)(void*,
5030: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
5040: 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  );.      */.    
5050: 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a    typedef void(*
5060: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5070: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
5080: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5090: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
50a0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c  g = va_arg(ap, L
50b0: 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20  OGFUNC_t);.     
50c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
50d0: 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76  nfig.pLogArg = v
50e0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
50f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5100: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 49     }..    /* EVI
5110: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 34  DENCE-OF: R-5554
5120: 38 2d 33 33 38 31 37 20 54 68 65 20 63 6f 6d 70  8-33817 The comp
5130: 69 6c 65 2d 74 69 6d 65 20 73 65 74 74 69 6e 67  ile-time setting
5140: 20 66 6f 72 20 55 52 49 20 66 69 6c 65 6e 61 6d   for URI filenam
5150: 65 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  es.    ** can be
5160: 20 63 68 61 6e 67 65 64 20 61 74 20 73 74 61 72   changed at star
5170: 74 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68 65  t-time using the
5180: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
5190: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
51a0: 4e 46 49 47 5f 55 52 49 2c 31 29 20 6f 72 0a 20  NFIG_URI,1) or. 
51b0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
51c0: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
51d0: 49 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66 69 67  IG_URI,0) config
51e0: 75 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20  uration calls.. 
51f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5200: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
5210: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
5220: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34 35  DENCE-OF: R-2545
5230: 31 2d 36 31 31 32 35 20 54 68 65 20 53 51 4c 49  1-61125 The SQLI
5240: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70  TE_CONFIG_URI op
5250: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
5260: 67 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 67  gle.      ** arg
5270: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e  ument of type in
5280: 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t. If non-zero, 
5290: 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e  then URI handlin
52a0: 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20  g is globally.  
52b0: 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
52c0: 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
52d0: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 55   is zero, then U
52e0: 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67  RI handling is g
52f0: 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  lobally.      **
5300: 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20   disabled. */.  
5310: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5320: 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
5330: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
5340: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5350: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
5360: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43   SQLITE_CONFIG_C
5370: 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43  OVERING_INDEX_SC
5380: 41 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AN: {.      /* E
5390: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36  VIDENCE-OF: R-36
53a0: 35 39 32 2d 30 32 37 37 32 20 54 68 65 20 53 51  592-02772 The SQ
53b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45  LITE_CONFIG_COVE
53c0: 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 0a  RING_INDEX_SCAN.
53d0: 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20        ** option 
53e0: 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69  takes a single i
53f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20  nteger argument 
5400: 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
5410: 65 74 65 64 20 61 73 20 61 0a 20 20 20 20 20 20  eted as a.      
5420: 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72  ** boolean in or
5430: 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72  der to enable or
5440: 20 64 69 73 61 62 6c 65 20 74 68 65 20 75 73 65   disable the use
5450: 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   of covering ind
5460: 69 63 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a  ices for.      *
5470: 2a 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * full table sca
5480: 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  ns in the query 
5490: 6f 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20  optimizer. */.  
54a0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
54b0: 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 20  lConfig.bUseCis 
54c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
54d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
54e0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
54f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
5500: 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  OG.    case SQLI
5510: 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
5520: 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
5530: 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55  f void(*SQLLOGFU
5540: 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c  NC_t)(void*, sql
5550: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
5560: 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  r*, int);.      
5570: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5580: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61  fig.xSqllog = va
5590: 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46  _arg(ap, SQLLOGF
55a0: 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71  UNC_t);.      sq
55b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
55c0: 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76  g.pSqllogArg = v
55d0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20 2a  a_arg(ap, void *
55e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
55f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5600: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5610: 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  NFIG_MMAP_SIZE: 
5620: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
5630: 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36 33 2d  NCE-OF: R-58063-
5640: 33 38 32 35 38 20 53 51 4c 49 54 45 5f 43 4f 4e  38258 SQLITE_CON
5650: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20 74 61  FIG_MMAP_SIZE ta
5660: 6b 65 73 20 74 77 6f 20 36 34 2d 62 69 74 0a 20  kes two 64-bit. 
5670: 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20       ** integer 
5680: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
5690: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
56a0: 74 68 65 20 64 65 66 61 75 6c 74 20 6d 6d 61 70  the default mmap
56b0: 20 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20 20 20   size limit.    
56c0: 20 20 2a 2a 20 28 74 68 65 20 64 65 66 61 75 6c    ** (the defaul
56d0: 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 50 52  t setting for PR
56e0: 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 29 20  AGMA mmap_size) 
56f0: 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
5700: 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 2a 2a  allowed.      **
5710: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
5720: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
5730: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20  e3_int64 szMmap 
5740: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
5750: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20  ite3_int64);.   
5760: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
5770: 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67   mxMmap = va_arg
5780: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  (ap, sqlite3_int
5790: 36 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  64);.      /* EV
57a0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 33  IDENCE-OF: R-533
57b0: 36 37 2d 34 33 31 39 30 20 49 66 20 65 69 74 68  67-43190 If eith
57c0: 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  er argument to t
57d0: 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a 20 20  his option is.  
57e0: 20 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 2c      ** negative,
57f0: 20 74 68 65 6e 20 74 68 61 74 20 61 72 67 75 6d   then that argum
5800: 65 6e 74 20 69 73 20 63 68 61 6e 67 65 64 20 74  ent is changed t
5810: 6f 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d 74 69  o its compile-ti
5820: 6d 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20  me default..    
5830: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
5840: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39  IDENCE-OF: R-349
5850: 39 33 2d 34 35 30 33 31 20 54 68 65 20 6d 61 78  93-45031 The max
5860: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d 61  imum allowed mma
5870: 70 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 0a 20  p size will be. 
5880: 20 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79       ** silently
5890: 20 74 72 75 6e 63 61 74 65 64 20 69 66 20 6e 65   truncated if ne
58a0: 63 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20  cessary so that 
58b0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65  it does not exce
58c0: 65 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ed the.      ** 
58d0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 78  compile-time max
58e0: 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 73  imum mmap size s
58f0: 65 74 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  et by the SQLITE
5900: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20  _MAX_MMAP_SIZE. 
5910: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d       ** compile-
5920: 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 20  time option..   
5930: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
5940: 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d  mxMmap<0 || mxMm
5950: 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  ap>SQLITE_MAX_MM
5960: 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  AP_SIZE ){.     
5970: 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49     mxMmap = SQLI
5980: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
59a0: 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73  if( szMmap<0 ) s
59b0: 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
59c0: 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
59d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  ;.      if( szMm
59e0: 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61  ap>mxMmap) szMma
59f0: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a00: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a10: 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d  onfig.mxMmap = m
5a20: 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  xMmap;.      sql
5a30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5a40: 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  .szMmap = szMmap
5a50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5a60: 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45     }..#if SQLITE
5a70: 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e  _OS_WIN && defin
5a80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5a90: 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20  MALLOC) /* IMP: 
5aa0: 52 2d 30 34 37 38 30 2d 35 35 38 31 35 20 2a 2f  R-04780-55815 */
5ab0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ac0: 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45  _CONFIG_WIN32_HE
5ad0: 41 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  APSIZE: {.      
5ae0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
5af0: 52 2d 33 34 39 32 36 2d 30 33 33 36 30 20 53 51  R-34926-03360 SQ
5b00: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33  LITE_CONFIG_WIN3
5b10: 32 5f 48 45 41 50 53 49 5a 45 20 74 61 6b 65 73  2_HEAPSIZE takes
5b20: 20 61 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20   a 32-bit.      
5b30: 2a 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  ** unsigned inte
5b40: 67 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 73  ger value that s
5b50: 70 65 63 69 66 69 65 73 20 74 68 65 20 6d 61 78  pecifies the max
5b60: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65  imum size of the
5b70: 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a   created.      *
5b80: 2a 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20  * heap. */.     
5b90: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5ba0: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
5bb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
5bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5bd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
5be0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5bf0: 50 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73  PMASZ: {.      s
5c00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5c10: 69 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72  ig.szPma = va_ar
5c20: 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
5c30: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
5c40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
5c50: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5c60: 53 54 4d 54 4a 52 4e 4c 5f 53 50 49 4c 4c 3a 20  STMTJRNL_SPILL: 
5c70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5c80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 74 6d  lobalConfig.nStm
5c90: 74 53 70 69 6c 6c 20 3d 20 76 61 5f 61 72 67 28  tSpill = va_arg(
5ca0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
5cb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
5cc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5cd0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
5ce0: 4e 43 45 53 0a 20 20 20 20 63 61 73 65 20 53 51  NCES.    case SQ
5cf0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 4f 52 54  LITE_CONFIG_SORT
5d00: 45 52 52 45 46 5f 53 49 5a 45 3a 20 7b 0a 20 20  ERREF_SIZE: {.  
5d10: 20 20 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 76      int iVal = v
5d20: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5d30: 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 3c 30        if( iVal<0
5d40: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 56 61 6c   ){.        iVal
5d50: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
5d60: 54 5f 53 4f 52 54 45 52 52 45 46 5f 53 49 5a 45  T_SORTERREF_SIZE
5d70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5d90: 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20  fig.szSorterRef 
5da0: 3d 20 28 75 33 32 29 69 56 61 6c 3b 0a 20 20 20  = (u32)iVal;.   
5db0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5dc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5dd0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
5de0: 45 46 45 52 45 4e 43 45 53 20 2a 2f 0a 0a 23 69  EFERENCES */..#i
5df0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5e00: 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20  LE_DESERIALIZE. 
5e10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5e20: 4f 4e 46 49 47 5f 4d 45 4d 44 42 5f 4d 41 58 53  ONFIG_MEMDB_MAXS
5e30: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  IZE: {.      sql
5e40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5e50: 2e 6d 78 4d 65 6d 64 62 53 69 7a 65 20 3d 20 76  .mxMemdbSize = v
5e60: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
5e70: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
5e80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5e90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
5ea0: 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
5eb0: 20 2a 2f 0a 0a 20 20 20 20 64 65 66 61 75 6c 74   */..    default
5ec0: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  : {.      rc = S
5ed0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
5ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5ef0: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
5f00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5f10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5f20: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
5f30: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
5f40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
5f50: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
5f60: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
5f70: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
5f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5f90: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
5fa0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
5fb0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
5fc0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
5fd0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
5fe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5ff0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
6000: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
6010: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
6020: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
6030: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
6040: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
6050: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
6060: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6070: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6080: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6090: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
60a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
60b0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
60c0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
60d0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
60e0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
60f0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6100: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6110: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
6120: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
6130: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6140: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6150: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
6160: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
6170: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6180: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6190: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
61a0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
61b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
61c0: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
61d0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
61e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
61f0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6200: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6210: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6220: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
6240: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
6250: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
6260: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
6270: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6280: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6290: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
62a0: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
62b0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
62c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
62d0: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
62e0: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
62f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
6300: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
6310: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
6320: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
6330: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6340: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6350: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6360: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6370: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6380: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6390: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
63a0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
63b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
63c0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
63d0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
63e0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
63f0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
6400: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
6410: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6420: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6430: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6440: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6450: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6460: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6470: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6480: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6490: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
64a0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
64b0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
64c0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
64d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
64e0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
64f0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6500: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6510: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6520: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6540: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6550: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6560: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6570: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6580: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6590: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
65a0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
65b0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
65c0: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
65d0: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
65e0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
65f0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6600: 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20  MAINDBNAME: {.  
6610: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36      /* IMP: R-06
6620: 38 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20  824-28531 */.   
6630: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32     /* IMP: R-362
6640: 35 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20 20 20  57-52125 */.    
6650: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62    db->aDb[0].zDb
6660: 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61  SName = va_arg(a
6670: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  p,char*);.      
6680: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
66b0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  TE_DBCONFIG_LOOK
66c0: 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76  ASIDE: {.      v
66d0: 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61  oid *pBuf = va_a
66e0: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f  rg(ap, void*); /
66f0: 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31  * IMP: R-26835-1
6700: 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  0964 */.      in
6710: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
6720: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a  , int);       /*
6730: 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35   IMP: R-47871-25
6740: 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  994 */.      int
6750: 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70   cnt = va_arg(ap
6760: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20  , int);      /* 
6770: 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33  IMP: R-04460-533
6780: 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  86 */.      rc =
6790: 20 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64   sqlite3Lookasid
67a0: 65 4f 70 65 6e 28 70 42 75 66 2c 20 73 7a 2c 20  eOpen(pBuf, sz, 
67b0: 63 6e 74 2c 20 26 64 62 2d 3e 6c 6f 6f 6b 61 73  cnt, &db->lookas
67c0: 69 64 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ide);.      brea
67d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
67e0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74  ault: {.      st
67f0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
6800: 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t {.        int 
6810: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op;      /* The 
6820: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
6830: 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f    u32 mask;    /
6840: 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69  * Mask of the bi
6850: 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61  t in sqlite3.fla
6860: 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20  gs to set/clear 
6870: 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67  */.      } aFlag
6880: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
6890: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
68a0: 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20  IG_ENABLE_FKEY, 
68b0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
68c0: 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20  _ForeignKeys    
68d0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
68e0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
68f0: 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20  BLE_TRIGGER,    
6900: 20 20 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c      SQLITE_Enabl
6910: 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20  eTrigger  },.   
6920: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
6930: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 56 49  CONFIG_ENABLE_VI
6940: 45 57 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  EW,           SQ
6950: 4c 49 54 45 5f 45 6e 61 62 6c 65 56 69 65 77 20  LITE_EnableView 
6960: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
6970: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
6980: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
6990: 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46  ENIZER, SQLITE_F
69a0: 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c  ts3Tokenizer  },
69b0: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
69c0: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
69d0: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
69e0: 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  , SQLITE_LoadExt
69f0: 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  ension  },.     
6a00: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6a10: 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f  NFIG_NO_CKPT_ON_
6a20: 43 4c 4f 53 45 2c 20 20 20 20 20 20 53 51 4c 49  CLOSE,      SQLI
6a30: 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65  TE_NoCkptOnClose
6a40: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
6a50: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
6a60: 4e 41 42 4c 45 5f 51 50 53 47 2c 20 20 20 20 20  NABLE_QPSG,     
6a70: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 6e 61        SQLITE_Ena
6a80: 62 6c 65 51 50 53 47 20 20 20 20 20 7d 2c 0a 20  bleQPSG     },. 
6a90: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
6aa0: 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
6ab0: 5f 45 51 50 2c 20 20 20 20 20 20 20 20 20 20 20  _EQP,           
6ac0: 53 51 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51  SQLITE_TriggerEQ
6ad0: 50 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20  P     },.       
6ae0: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
6af0: 49 47 5f 52 45 53 45 54 5f 44 41 54 41 42 41 53  IG_RESET_DATABAS
6b00: 45 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,        SQLITE
6b10: 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 20 20  _ResetDatabase  
6b20: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
6b30: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 45 46  ITE_DBCONFIG_DEF
6b40: 45 4e 53 49 56 45 2c 20 20 20 20 20 20 20 20 20  ENSIVE,         
6b50: 20 20 20 20 53 51 4c 49 54 45 5f 44 65 66 65 6e      SQLITE_Defen
6b60: 73 69 76 65 20 20 20 20 20 20 7d 2c 0a 20 20 20  sive      },.   
6b70: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
6b80: 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f  CONFIG_WRITABLE_
6b90: 53 43 48 45 4d 41 2c 20 20 20 20 20 20 20 53 51  SCHEMA,       SQ
6ba0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
6bb0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 20 20 20 53 51 4c 49 54 45 5f 4e 6f 53 63 68 65     SQLITE_NoSche
6bf0: 6d 61 45 72 72 6f 72 20 20 7d 2c 0a 20 20 20 20  maError  },.    
6c00: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
6c10: 4f 4e 46 49 47 5f 4c 45 47 41 43 59 5f 41 4c 54  ONFIG_LEGACY_ALT
6c20: 45 52 5f 54 41 42 4c 45 2c 20 20 20 20 53 51 4c  ER_TABLE,    SQL
6c30: 49 54 45 5f 4c 65 67 61 63 79 41 6c 74 65 72 20  ITE_LegacyAlter 
6c40: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
6c50: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6c60: 44 51 53 5f 44 44 4c 2c 20 20 20 20 20 20 20 20  DQS_DDL,        
6c70: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 71         SQLITE_Dq
6c80: 73 44 44 4c 20 20 20 20 20 20 20 20 20 7d 2c 0a  sDDL         },.
6c90: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
6ca0: 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44 4d  _DBCONFIG_DQS_DM
6cb0: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L,              
6cc0: 20 53 51 4c 49 54 45 5f 44 71 73 44 4d 4c 20 20   SQLITE_DqsDML  
6cd0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
6ce0: 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  };.      unsigne
6cf0: 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72  d int i;.      r
6d00: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
6d10: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39  ; /* IMP: R-4279
6d20: 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20  0-23372 */.     
6d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
6d40: 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20  ySize(aFlagOp); 
6d50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
6d60: 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d  ( aFlagOp[i].op=
6d70: 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =op ){.         
6d80: 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f   int onoff = va_
6d90: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
6da0: 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65          int *pRe
6db0: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
6dc0: 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nt*);.          
6dd0: 75 36 34 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64  u64 oldFlags = d
6de0: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  b->flags;.      
6df0: 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20      if( onoff>0 
6e00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ){.            d
6e10: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61  b->flags |= aFla
6e20: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  gOp[i].mask;.   
6e30: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
6e40: 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20   onoff==0 ){.   
6e50: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
6e60: 67 73 20 26 3d 20 7e 28 75 36 34 29 61 46 6c 61  gs &= ~(u64)aFla
6e70: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  gOp[i].mask;.   
6e80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6e90: 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21     if( oldFlags!
6ea0: 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20  =db->flags ){.  
6eb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6ec0: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
6ed0: 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29  tatements(db, 0)
6ee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6ef0: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73          if( pRes
6f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f10: 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  *pRes = (db->fla
6f20: 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e  gs & aFlagOp[i].
6f30: 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20  mask)!=0;.      
6f40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6f50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6f60: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6f70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6f80: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6f90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
6fa0: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
6fb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6fc0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
6fd0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
6fe0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
6ff0: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
7000: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
7010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7020: 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  binCollFunc(.  v
7030: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
7040: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7050: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7060: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7070: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7080: 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 55    int rc, n;.  U
7090: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
70a0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 6e 20 3d 20  NotUsed);.  n = 
70b0: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
70c0: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f  ey1 : nKey2;.  /
70d0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
70e0: 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68 65  -65033-28449 The
70f0: 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59   built-in BINARY
7100: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61   collation compa
7110: 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73  res.  ** strings
7120: 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75 73   byte by byte us
7130: 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29  ing the memcmp()
7140: 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74   function from t
7150: 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20  he standard C.  
7160: 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20  ** library. */. 
7170: 20 61 73 73 65 72 74 28 20 70 4b 65 79 31 20 26   assert( pKey1 &
7180: 26 20 70 4b 65 79 32 20 29 3b 0a 20 20 72 63 20  & pKey2 );.  rc 
7190: 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20  = memcmp(pKey1, 
71a0: 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28  pKey2, n);.  if(
71b0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
71c0: 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32   = nKey1 - nKey2
71d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
71e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
71f0: 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   is the collatin
7200: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  g function named
7210: 20 22 52 54 52 49 4d 22 20 77 68 69 63 68 20 69   "RTRIM" which i
7220: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
7230: 6c 61 62 6c 65 2e 20 20 49 67 6e 6f 72 65 20 74  lable.  Ignore t
7240: 72 61 69 6c 69 6e 67 20 73 70 61 63 65 73 2e 0a  railing spaces..
7250: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 74  */.static int rt
7260: 72 69 6d 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  rimCollFunc(.  v
7270: 6f 69 64 20 2a 70 55 73 65 72 2c 0a 20 20 69 6e  oid *pUser,.  in
7280: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7290: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
72a0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
72b0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
72c0: 63 6f 6e 73 74 20 75 38 20 2a 70 4b 31 20 3d 20  const u8 *pK1 = 
72d0: 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
72e0: 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b  ;.  const u8 *pK
72f0: 32 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  2 = (const u8*)p
7300: 4b 65 79 32 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Key2;.  while( n
7310: 4b 65 79 31 20 26 26 20 70 4b 31 5b 6e 4b 65 79  Key1 && pK1[nKey
7320: 31 2d 31 5d 3d 3d 27 20 27 20 29 20 6e 4b 65 79  1-1]==' ' ) nKey
7330: 31 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4b  1--;.  while( nK
7340: 65 79 32 20 26 26 20 70 4b 32 5b 6e 4b 65 79 32  ey2 && pK2[nKey2
7350: 2d 31 5d 3d 3d 27 20 27 20 29 20 6e 4b 65 79 32  -1]==' ' ) nKey2
7360: 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 62 69 6e  --;.  return bin
7370: 43 6f 6c 6c 46 75 6e 63 28 70 55 73 65 72 2c 20  CollFunc(pUser, 
7380: 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 6e 4b  nKey1, pKey1, nK
7390: 65 79 32 2c 20 70 4b 65 79 32 29 3b 0a 7d 0a 0a  ey2, pKey2);.}..
73a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
73b0: 65 20 69 66 20 43 6f 6c 6c 53 65 71 20 69 73 20  e if CollSeq is 
73c0: 74 68 65 20 64 65 66 61 75 6c 74 20 62 75 69 6c  the default buil
73d0: 74 2d 69 6e 20 42 49 4e 41 52 59 2e 0a 2a 2f 0a  t-in BINARY..*/.
73e0: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 42 69 6e  int sqlite3IsBin
73f0: 61 72 79 28 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  ary(const CollSe
7400: 71 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  q *p){.  assert(
7410: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 78 43 6d 70   p==0 || p->xCmp
7420: 21 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 7c 7c  !=binCollFunc ||
7430: 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65   strcmp(p->zName
7440: 2c 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 3b  ,"BINARY")==0 );
7450: 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c  .  return p==0 |
7460: 7c 20 70 2d 3e 78 43 6d 70 3d 3d 62 69 6e 43 6f  | p->xCmp==binCo
7470: 6c 6c 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  llFunc;.}../*.**
7480: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
7490: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
74a0: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
74b0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
74c0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
74d0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
74e0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
74f0: 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** com
7500: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
7510: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
7520: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
7530: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
7540: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
7550: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
7560: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
7570: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
7580: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
7590: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
75a0: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
75b0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
75c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
75d0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
75e0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
75f0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
7600: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
7610: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
7620: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
7630: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
7640: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
7650: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
7660: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
7670: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
7680: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
7690: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
76a0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
76b0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
76c0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
76d0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
76e0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
76f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
7700: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
7710: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
7720: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
7730: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7740: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
7750: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7760: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7770: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
7780: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
7790: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
77a0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
77b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
77c0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
77d0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73    return db->las
77e0: 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tRowid;.}../*.**
77f0: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 72   Set the value r
7800: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
7810: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7820: 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66  rt_rowid() API f
7830: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
7840: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61 73   sqlite3_set_las
7850: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
7860: 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69  qlite3 *db, sqli
7870: 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
7880: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7890: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
78a0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
78b0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
78c0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
78d0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
78e0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
78f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
7900: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7910: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
7920: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 52  ->lastRowid = iR
7930: 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  owid;.  sqlite3_
7940: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
7950: 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mutex);.}../*.**
7960: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7970: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e  er of changes in
7980: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7990: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
79a0: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _exec()..*/.int 
79b0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
79c0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
79d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
79e0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
79f0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7a00: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7a10: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7a20: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7a40: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7a50: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
7a60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7a70: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
7a80: 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  es since the dat
7a90: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
7aa0: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20   opened..*/.int 
7ab0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
7ac0: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
7ad0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
7ae0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
7af0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
7b00: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
7b10: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
7b20: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
7b30: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
7b40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
7b50: 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c  eturn db->nTotal
7b60: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
7b70: 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20   Close all open 
7b80: 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73  savepoints. This
7b90: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d   function only m
7ba0: 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64  anipulates field
7bb0: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  s of the.** data
7bc0: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  base handle obje
7bd0: 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ct, it does not 
7be0: 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f  close any savepo
7bf0: 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65  ints that may be
7c00: 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20   open.** at the 
7c10: 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76  b-tree/pager lev
7c20: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
7c30: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
7c40: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
7c50: 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53  .  while( db->pS
7c60: 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
7c70: 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20  Savepoint *pTmp 
7c80: 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
7c90: 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70  ;.    db->pSavep
7ca0: 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
7cb0: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  xt;.    sqlite3D
7cc0: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
7cd0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65  .  }.  db->nSave
7ce0: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  point = 0;.  db-
7cf0: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
7d00: 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  .  db->isTransac
7d10: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
7d20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
7d30: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
7d40: 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  r function assoc
7d50: 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44  iated with FuncD
7d60: 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78  ef p, if any. Ex
7d70: 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73  cept,.** if this
7d80: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
7d90: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e   copy of the fun
7da0: 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e  ction, do not in
7db0: 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c  voke it. Multipl
7dc0: 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61  e.** copies of a
7dd0: 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e   single function
7de0: 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65   are created whe
7df0: 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  n create_functio
7e00: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  n() is called.**
7e10: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59   with SQLITE_ANY
7e20: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
7e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7e40: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
7e50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
7e60: 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e  ncDef *p){.  Fun
7e70: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
7e80: 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 75 2e  structor = p->u.
7e90: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69  pDestructor;.  i
7ea0: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
7eb0: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
7ec0: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  r->nRef--;.    i
7ed0: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  f( pDestructor->
7ee0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
7ef0: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44   pDestructor->xD
7f00: 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74  estroy(pDestruct
7f10: 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a  or->pUserData);.
7f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7f30: 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63  ree(db, pDestruc
7f40: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tor);.    }.  }.
7f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e  }../*.** Disconn
7f60: 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ect all sqlite3_
7f70: 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61  vtab objects tha
7f80: 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61  t belong to data
7f90: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
7fa0: 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63  ** db. This is c
7fb0: 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73  alled when db is
7fc0: 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a   being closed..*
7fd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
7fe0: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
7ff0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
8000: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8010: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
8020: 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45 6c   int i;.  HashEl
8030: 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  em *p;.  sqlite3
8040: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
8050: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
8060: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
8070: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
8080: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
8090: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
80a0: 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   pSchema ){.    
80b0: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
80c0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
80d0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70  ->tblHash); p; p
80e0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
80f0: 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  p)){.        Tab
8100: 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c  le *pTab = (Tabl
8110: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
8120: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  ta(p);.        i
8130: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
8140: 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  b) ) sqlite3Vtab
8150: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70  Disconnect(db, p
8160: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
8170: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d    }.  }.  for(p=
8180: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
8190: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70  &db->aModule); p
81a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
81b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(p)){.    Modu
81c0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
81d0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
81e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ata(p);.    if( 
81f0: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b  pMod->pEpoTab ){
8200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
8210: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
8220: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b   pMod->pEpoTab);
8230: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8240: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
8250: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
8260: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
8270: 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  b);.#else.  UNUS
8280: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
8290: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
82a0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
82b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
82c0: 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69  tion db has unfi
82d0: 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64  nalized prepared
82e0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  .** statements o
82f0: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c  r unfinished sql
8300: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
8310: 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  cts.  .*/.static
8320: 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49   int connectionI
8330: 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64  sBusy(sqlite3 *d
8340: 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  b){.  int j;.  a
8350: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8360: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
8370: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62  tex) );.  if( db
8380: 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e  ->pVdbe ) return
8390: 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   1;.  for(j=0; j
83a0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
83b0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
83c0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b   db->aDb[j].pBt;
83d0: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
83e0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
83f0: 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65  Backup(pBt) ) re
8400: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
8410: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8420: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
8430: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
8440: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
8450: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71   sqlite3Close(sq
8460: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66  lite3 *db, int f
8470: 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69  orceZombie){.  i
8480: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a  f( !db ){.    /*
8490: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
84a0: 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c  63257-11740 Call
84b0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ing sqlite3_clos
84c0: 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  e() or.    ** sq
84d0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
84e0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69   with a NULL poi
84f0: 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73  nter argument is
8500: 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
8510: 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  p. */.    return
8520: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8530: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
8540: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
8550: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
8560: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
8570: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
8580: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8590: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
85a0: 69 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26  if( db->mTrace &
85b0: 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c   SQLITE_TRACE_CL
85c0: 4f 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  OSE ){.    db->x
85d0: 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41  Trace(SQLITE_TRA
85e0: 43 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54  CE_CLOSE, db->pT
85f0: 72 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b  raceArg, db, 0);
8600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65  .  }..  /* Force
8610: 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c   xDisconnect cal
8620: 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61  ls on all virtua
8630: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69  l tables */.  di
8640: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
8650: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20  db);..  /* If a 
8660: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
8670: 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e  pen, the disconn
8680: 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c  ectAllVtab() cal
8690: 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c  l above.  ** wil
86a0: 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65  l not have calle
86b0: 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  d the xDisconnec
86c0: 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e  t() method on an
86d0: 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74  y virtual.  ** t
86e0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d  ables in the db-
86f0: 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79  >aVTrans[] array
8700: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
8710: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8720: 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20  ack().  ** call 
8730: 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e  will do so. We n
8740: 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62  eed to do this b
8750: 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20  efore the check 
8760: 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20  for active.  ** 
8770: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62  SQL statements b
8780: 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74  elow, as the v-t
8790: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
87a0: 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69  ion may be stori
87b0: 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65  ng.  ** some pre
87c0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
87d0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
87e0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  /.  sqlite3VtabR
87f0: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20  ollback(db);..  
8800: 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69  /* Legacy behavi
8810: 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73  or (sqlite3_clos
8820: 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73  e() behavior) is
8830: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
8840: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74  SQLITE_BUSY if t
8850: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61  he connection ca
8860: 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  n not be closed 
8870: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a  immediately..  *
8880: 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f  /.  if( !forceZo
8890: 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69  mbie && connecti
88a0: 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a  onIsBusy(db) ){.
88b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
88c0: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
88d0: 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65  TE_BUSY, "unable
88e0: 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f   to close due to
88f0: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20   unfinalized ". 
8900: 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74        "statement
8910: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
8920: 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73  backups");.    s
8930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8940: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
8950: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8960: 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64  _BUSY;.  }..#ifd
8970: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8980: 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
8990: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
89a0: 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
89b0: 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20   /* Closing the 
89c0: 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70  handle. Fourth p
89d0: 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
89e0: 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20  ed the value 2. 
89f0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  */.    sqlite3Gl
8a00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
8a10: 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  og(sqlite3Global
8a20: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
8a30: 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20  g, db, 0, 2);.  
8a40: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
8a50: 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65  onvert the conne
8a60: 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d  ction into a zom
8a70: 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f  bie and then clo
8a80: 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62  se it..  */.  db
8a90: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
8aa0: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20  _MAGIC_ZOMBIE;. 
8ab0: 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74   sqlite3LeaveMut
8ac0: 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65  exAndCloseZombie
8ad0: 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (db);.  return S
8ae0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8af0: 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e  ** Two variation
8b00: 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20  s on the public 
8b10: 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c  interface for cl
8b20: 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  osing a database
8b30: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  .** connection. 
8b40: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
8b50: 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75  e() version retu
8b60: 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20  rns SQLITE_BUSY 
8b70: 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68  and.** leaves th
8b80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74  e connection opt
8b90: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
8ba0: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
8bb0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
8bc0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
8bd0: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
8be0: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
8bf0: 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65  close_v2().** ve
8c00: 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65  rsion forces the
8c10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
8c20: 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69  ecome a zombie i
8c30: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75  f there are.** u
8c40: 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65  nclosed resource
8c50: 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20  s, and arranges 
8c60: 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e  for deallocation
8c70: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a   when the last.*
8c80: 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d  * prepare statem
8c90: 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  ent or sqlite3_b
8ca0: 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f  ackup closes..*/
8cb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
8cc0: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  se(sqlite3 *db){
8cd0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43   return sqlite3C
8ce0: 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e  lose(db,0); }.in
8cf0: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  t sqlite3_close_
8d00: 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  v2(sqlite3 *db){
8d10: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43   return sqlite3C
8d20: 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a  lose(db,1); }...
8d30: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
8d40: 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73  mutex on databas
8d50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  e connection db.
8d60: 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f  .**.** Furthermo
8d70: 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20  re, if database 
8d80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73  connection db is
8d90: 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69   a zombie (meani
8da0: 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a  ng that there.**
8db0: 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f   has been a prio
8dc0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
8dd0: 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73  3_close(db) or s
8de0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
8df0: 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72  db)) and.** ever
8e00: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68  y sqlite3_stmt h
8e10: 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61  as now been fina
8e20: 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20  lized and every 
8e30: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68  sqlite3_backup h
8e40: 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20  as.** finished, 
8e50: 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65  then free all re
8e60: 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  sources..*/.void
8e70: 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74   sqlite3LeaveMut
8e80: 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65  exAndCloseZombie
8e90: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8ea0: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20   HashElem *i;   
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69   /* Hash table i
8ed0: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
8ee0: 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   j;..  /* If the
8ef0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
8f00: 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ng sqlite3_stmt 
8f10: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
8f20: 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f  p objects.  ** o
8f30: 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  r if the connect
8f40: 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
8f50: 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73  been closed by s
8f60: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
8f70: 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73  ),.  ** then jus
8f80: 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65  t leave the mute
8f90: 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  x and return..  
8fa0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67  */.  if( db->mag
8fb0: 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic!=SQLITE_MAGIC
8fc0: 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65  _ZOMBIE || conne
8fd0: 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20  ctionIsBusy(db) 
8fe0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
8ff0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9000: 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72  utex);.    retur
9010: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  n;.  }..  /* If 
9020: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
9030: 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
9040: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
9050: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20  connection has. 
9060: 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73   ** closed all s
9070: 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20  qlite3_stmt and 
9080: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
9090: 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62  bjects and has b
90a0: 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20  een.  ** passed 
90b0: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  to sqlite3_close
90c0: 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69   (meaning that i
90d0: 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20  t is a zombie). 
90e0: 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a   Therefore,.  **
90f0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72   go ahead and fr
9100: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
9110: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ..  */..  /* If 
9120: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
9130: 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62   open, roll it b
9140: 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65  ack. This also e
9150: 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20  nsures that if. 
9160: 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65   ** any database
9170: 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65   schemas have be
9180: 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61  en modified by a
9190: 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72  n uncommitted tr
91a0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74  ansaction.  ** t
91b0: 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41  hey are reset. A
91c0: 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75  nd that the requ
91d0: 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ired b-tree mute
91e0: 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b  x is held to mak
91f0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  e.  ** the pager
9200: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
9210: 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74  hema reset an at
9220: 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20  omic operation. 
9230: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c  */.  sqlite3Roll
9240: 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
9250: 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72  TE_OK);..  /* Fr
9260: 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  ee any outstandi
9270: 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72  ng Savepoint str
9280: 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71  uctures. */.  sq
9290: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
92a0: 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ints(db);..  /* 
92b0: 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61  Close all databa
92c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  se connections *
92d0: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  /.  for(j=0; j<d
92e0: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
92f0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
9300: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a   = &db->aDb[j];.
9310: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
9320: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9330: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d  3BtreeClose(pDb-
9340: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62  >pBt);.      pDb
9350: 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->pBt = 0;.     
9360: 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20   if( j!=1 ){.   
9370: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
9380: 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 0;.      }. 
9390: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c     }.  }.  /* Cl
93a0: 65 61 72 20 74 68 65 20 54 45 4d 50 20 73 63 68  ear the TEMP sch
93b0: 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20 61  ema separately a
93c0: 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28  nd last */.  if(
93d0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
93e0: 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ema ){.    sqlit
93f0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62  e3SchemaClear(db
9400: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
9410: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9420: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
9430: 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75  b);..  /* Free u
9440: 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61  p the array of a
9450: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
9460: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  es */.  sqlite3C
9470: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
9480: 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65  rray(db);.  asse
9490: 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29  rt( db->nDb<=2 )
94a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
94b0: 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb==db->aDbStat
94c0: 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c  ic );..  /* Tell
94d0: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74   the code in not
94e0: 69 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63  ify.c that the c
94f0: 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e  onnection no lon
9500: 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20  ger holds any.  
9510: 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65  ** locks and doe
9520: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
9530: 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b  y further unlock
9540: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
9550: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
9560: 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65  3ConnectionClose
9570: 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  d(db);..  for(i=
9580: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9590: 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20  &db->aFunc); i; 
95a0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
95b0: 28 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  (i)){.    FuncDe
95c0: 66 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20  f *pNext, *p;.  
95d0: 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68    p = sqliteHash
95e0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b  Data(i);.    do{
95f0: 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44  .      functionD
9600: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20  estroy(db, p);. 
9610: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
9620: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
9630: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9640: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65  );.      p = pNe
9650: 78 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  xt;.    }while( 
9660: 70 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p );.  }.  sqlit
9670: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
9680: 3e 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69  >aFunc);.  for(i
9690: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
96a0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
96b0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
96c0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f  Next(i)){.    Co
96d0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
96e0: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
96f0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
9700: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64   /* Invoke any d
9710: 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73  estructors regis
9720: 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74  tered for collat
9730: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
9740: 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66  r data. */.    f
9750: 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
9760: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  ){.      if( pCo
9770: 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20  ll[j].xDel ){.  
9780: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78        pColl[j].x
9790: 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73  Del(pColl[j].pUs
97a0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
97b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
97c0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b  Free(db, pColl);
97d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
97e0: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f  shClear(&db->aCo
97f0: 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
9800: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9810: 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69  UALTABLE.  for(i
9820: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9830: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
9840: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9850: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(i)){.    Mod
9860: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
9870: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
9880: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 73 71 6c  Data(i);.    sql
9890: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
98a0: 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20  sTableClear(db, 
98b0: 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  pMod);.    sqlit
98c0: 65 33 56 74 61 62 4d 6f 64 75 6c 65 55 6e 72 65  e3VtabModuleUnre
98d0: 66 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d  f(db, pMod);.  }
98e0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
98f0: 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ear(&db->aModule
9900: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  );.#endif..  sql
9910: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
9920: 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61  LITE_OK); /* Dea
9930: 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63  llocates any cac
9940: 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67  hed error string
9950: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  s. */.  sqlite3V
9960: 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72  alueFree(db->pEr
9970: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f  r);.  sqlite3Clo
9980: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
9990: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
99a0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
99b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
99c0: 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73  db->auth.zAuthUs
99d0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er);.  sqlite3_f
99e0: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
99f0: 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  thPW);.#endif.. 
9a00: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
9a10: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
9a20: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
9a30: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
9a40: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
9a50: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
9a60: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
9a70: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
9a80: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
9a90: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
9aa0: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
9ab0: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
9ac0: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
9ad0: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
9ae0: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
9af0: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
9b00: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
9b10: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
9b20: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
9b30: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
9b40: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
9b50: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
9b60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
9b70: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31  ee(db, db->aDb[1
9b80: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ].pSchema);.  sq
9b90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9ba0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9bb0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
9bc0: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
9bd0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9be0: 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29  _free(db->mutex)
9bf0: 3b 0a 20 20 73 71 6c 69 74 65 33 4c 6f 6f 6b 61  ;.  sqlite3Looka
9c00: 73 69 64 65 43 6c 6f 73 65 28 26 64 62 2d 3e 6c  sideClose(&db->l
9c10: 6f 6f 6b 61 73 69 64 65 29 3b 0a 20 20 73 71 6c  ookaside);.  sql
9c20: 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d  ite3_free(db);.}
9c30: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
9c40: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
9c50: 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64  les.  If tripCod
9c60: 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
9c70: 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20  OK, then.** any 
9c80: 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
9c90: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22  e invalidated ("
9ca0: 74 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e  tripped" - as in
9cb0: 20 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72   "tripping a cir
9cc0: 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22  cuit.** breaker"
9cd0: 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65  ) and made to re
9ce0: 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66  turn tripCode if
9cf0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66   there are any f
9d00: 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70  urther.** attemp
9d10: 74 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ts to use that c
9d20: 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72  ursor.  Read cur
9d30: 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e  sors remain open
9d40: 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75   and valid.** bu
9d50: 74 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e  t are "saved" in
9d60: 20 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20   case the table 
9d70: 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20  pages are moved 
9d80: 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20  around..*/.void 
9d90: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
9da0: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
9db0: 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20  int tripCode){. 
9dc0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e   int i;.  int in
9dd0: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74  Trans = 0;.  int
9de0: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20   schemaChange;. 
9df0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9e00: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
9e10: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
9e20: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
9e30: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62  lloc();..  /* Ob
9e40: 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20  tain all b-tree 
9e50: 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d  mutexes before m
9e60: 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20  aking any calls 
9e70: 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  to BtreeRollback
9e80: 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69  (). .  ** This i
9e90: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63  s important in c
9ea0: 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
9eb0: 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  ion being rolled
9ec0: 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d   back has.  ** m
9ed0: 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
9ee0: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
9ef0: 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
9f00: 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e  es are not taken
9f10: 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e  .  ** here, then
9f20: 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d   another shared-
9f30: 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  cache connection
9f40: 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20   might sneak in 
9f50: 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
9f60: 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61   database rollba
9f70: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
9f80: 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63  set, which can c
9f90: 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20  ause false.  ** 
9fa0: 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72  corruption repor
9fb0: 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  ts in some cases
9fc0: 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
9fd0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
9fe0: 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65  ;.  schemaChange
9ff0: 20 3d 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73   = (db->mDbFlags
a000: 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61   & DBFLAG_Schema
a010: 43 68 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62  Change)!=0 && db
a020: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a  ->init.busy==0;.
a030: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
a040: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
a050: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
a060: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
a070: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69  if( p ){.      i
a080: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
a090: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
a0a0: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
a0b0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a0c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
a0d0: 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f  llback(p, tripCo
a0e0: 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67  de, !schemaChang
a0f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
a100: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
a110: 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ack(db);.  sqlit
a120: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
a130: 63 28 29 3b 0a 0a 20 20 69 66 28 20 73 63 68 65  c();..  if( sche
a140: 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  maChange ){.    
a150: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
a160: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
a170: 64 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  db, 0);.    sqli
a180: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
a190: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
a1a0: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
a1b0: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
a1c0: 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65  b);..  /* Any de
a1d0: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
a1e0: 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76  t violations hav
a1f0: 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c  e now been resol
a200: 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44  ved. */.  db->nD
a210: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
a220: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
a230: 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64  ImmCons = 0;.  d
a240: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36  b->flags &= ~(u6
a250: 34 29 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  4)SQLITE_DeferFK
a260: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
a270: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
a280: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
a290: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
a2a0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
a2b0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
a2c0: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
a2d0: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
a2e0: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
a2f0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
a300: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
a310: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
a320: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
a330: 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ic string contai
a340: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f  ning the name co
a350: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
a360: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
a370: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
a380: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  e argument..*/.#
a390: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a3a0: 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29  E_NEED_ERR_NAME)
a3b0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
a3c0: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20  ite3ErrName(int 
a3d0: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
a3e0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
a3f0: 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20  int i, origRc = 
a400: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
a410: 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20  <2 && zName==0; 
a420: 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29  i++, rc &= 0xff)
a430: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
a440: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
a450: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
a460: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a470: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a490: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a4a0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
a4b0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a4c0: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
a4d0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a4e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a4f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e   SQLITE_ERROR_SN
a500: 41 50 53 48 4f 54 3a 20 20 20 20 20 7a 4e 61 6d  APSHOT:     zNam
a510: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  e = "SQLITE_ERRO
a520: 52 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20  R_SNAPSHOT";    
a530: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a540: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
a550: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
a560: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
a570: 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20  ERNAL";         
a580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a590: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
a5b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
a5c0: 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RM";            
a5d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a5e0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
a5f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
a600: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
a610: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20  BORT";          
a620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a630: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
a640: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20  T_ROLLBACK:     
a650: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a660: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b  ABORT_ROLLBACK";
a670: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a680: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
a690: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
a6a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a6b0: 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20  _BUSY";         
a6c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a6d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
a6e0: 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20  SY_RECOVERY:    
a6f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a700: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22  E_BUSY_RECOVERY"
a710: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a720: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
a730: 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20  USY_SNAPSHOT:   
a740: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a750: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
a760: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a770: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a780: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20  LOCKED:         
a790: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a7a0: 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20  ITE_LOCKED";    
a7b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a7c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a7d0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
a7e0: 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CHE: zName = "SQ
a7f0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
a800: 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a  EDCACHE";break;.
a810: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a820: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  E_NOMEM:        
a830: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a840: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20  QLITE_NOMEM";   
a850: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a860: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a870: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20  TE_READONLY:    
a880: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a890: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22  SQLITE_READONLY"
a8a0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
a8b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a8c0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
a8d0: 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20  OVERY:  zName = 
a8e0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
a8f0: 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61  _RECOVERY"; brea
a900: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a910: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
a920: 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65 20 3d  NTINIT:  zName =
a930: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
a940: 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62 72 65  Y_CANTINIT"; bre
a950: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a960: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
a970: 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20  OLLBACK:  zName 
a980: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
a990: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  LY_ROLLBACK"; br
a9a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a9b0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a9c0: 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65  DBMOVED:   zName
a9d0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
a9e0: 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62  NLY_DBMOVED";  b
a9f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aa00: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
aa10: 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e 61 6d  _DIRECTORY: zNam
aa20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
aa30: 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 22 3b  ONLY_DIRECTORY";
aa40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aa50: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
aa60: 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61  PT:          zNa
aa70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
aa80: 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ERRUPT";        
aa90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aaa0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a  se SQLITE_IOERR:
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
aac0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
aad0: 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERR";           
aae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aaf0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ab00: 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a  _READ:         z
ab10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ab20: 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20  OERR_READ";     
ab30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ab40: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ab50: 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20  R_SHORT_READ:   
ab60: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ab70: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
ab80: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
ab90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
aba0: 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20  RR_WRITE:       
abb0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
abc0: 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20  _IOERR_WRITE";  
abd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
abe0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
abf0: 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20  ERR_FSYNC:      
ac00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac10: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20  E_IOERR_FSYNC"; 
ac20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ac40: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20  OERR_DIR_FSYNC: 
ac50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ac60: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
ac70: 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  NC";   break;.  
ac80: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ac90: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20  IOERR_TRUNCATE: 
aca0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
acb0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
acc0: 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TE";    break;. 
acd0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ace0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20  _IOERR_FSTAT:   
acf0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ad00: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
ad10: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
ad20: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad30: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20  E_IOERR_UNLOCK: 
ad40: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ad50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
ad60: 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  CK";      break;
ad70: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ad80: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a  TE_IOERR_RDLOCK:
ad90: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ada0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
adb0: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
adc0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
add0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
ade0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
adf0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
ae00: 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65 61  LETE";      brea
ae10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae20: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
ae30: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
ae40: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e   "SQLITE_IOERR_N
ae50: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65  OMEM";       bre
ae60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
ae80: 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  SS:       zName 
ae90: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aea0: 41 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72  ACCESS";      br
aeb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aec0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
aed0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a  CKRESERVEDLOCK:.
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
af10: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
af20: 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b  VEDLOCK"; break;
af30: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
af40: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20  TE_IOERR_LOCK:  
af50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
af60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
af70: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
af80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
af90: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a  ITE_IOERR_CLOSE:
afa0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
afb0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  "SQLITE_IOERR_CL
afc0: 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  OSE";       brea
afd0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
afe0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
aff0: 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  LOSE:    zName =
b000: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
b010: 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65  IR_CLOSE";   bre
b020: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b030: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
b040: 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  PEN:      zName 
b050: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b060: 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72  SHMOPEN";     br
b070: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b080: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b090: 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65  SIZE:      zName
b0a0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b0b0: 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62  _SHMSIZE";     b
b0c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b0d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b0e0: 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d  MLOCK:      zNam
b0f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b100: 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20  R_SHMLOCK";     
b110: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b120: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b130: 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61  HMMAP:       zNa
b140: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b150: 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20  RR_SHMMAP";     
b160: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b170: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b180: 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  SEEK:         zN
b190: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b1a0: 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20  ERR_SEEK";      
b1b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b1c0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b1d0: 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a  _DELETE_NOENT: z
b1e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b1f0: 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
b200: 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  T";break;.      
b210: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b220: 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20  R_MMAP:         
b230: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b240: 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20  IOERR_MMAP";    
b250: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b260: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b270: 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20  RR_GETTEMPPATH: 
b280: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b290: 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
b2a0: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
b2b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b2c0: 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20  ERR_CONVPATH:   
b2d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b2e0: 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
b2f0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
b300: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b310: 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20  ORRUPT:         
b320: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b330: 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20  TE_CORRUPT";    
b340: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b360: 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20  CORRUPT_VTAB:   
b370: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b380: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
b390: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b3a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b3b0: 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20  _NOTFOUND:      
b3c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b3d0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20  LITE_NOTFOUND"; 
b3e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b3f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b400: 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20  E_FULL:         
b410: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b420: 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20  QLITE_FULL";    
b430: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b440: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b450: 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20  TE_CANTOPEN:    
b460: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b470: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22  SQLITE_CANTOPEN"
b480: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b490: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b4a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54  ITE_CANTOPEN_NOT
b4b0: 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20  EMPDIR: zName = 
b4c0: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b4d0: 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61  _NOTEMPDIR";brea
b4e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b4f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
b500: 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  DIR:     zName =
b510: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
b520: 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72 65  N_ISDIR";    bre
b530: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b540: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
b550: 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  ULLPATH:  zName 
b560: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
b570: 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72  EN_FULLPATH"; br
b580: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b590: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b5a0: 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65  CONVPATH:  zName
b5b0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
b5c0: 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62  PEN_CONVPATH"; b
b5d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b5e0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
b5f0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
b600: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54  e = "SQLITE_PROT
b610: 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20  OCOL";          
b620: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b630: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b650: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50  me = "SQLITE_EMP
b660: 54 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TY";            
b670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b680: 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  se SQLITE_SCHEMA
b690: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
b6a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43  ame = "SQLITE_SC
b6b0: 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20  HEMA";          
b6c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b6d0: 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  ase SQLITE_TOOBI
b6e0: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  G:             z
b6f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54  Name = "SQLITE_T
b700: 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20 20  OOBIG";         
b710: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b720: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b730: 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20  TRAINT:         
b740: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b750: 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20  CONSTRAINT";    
b760: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b770: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b780: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20  STRAINT_UNIQUE: 
b790: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b7a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
b7b0: 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  UE"; break;.    
b7c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b7d0: 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
b7e0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
b7f0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
b800: 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20  GGER";break;.   
b810: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b820: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
b830: 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  NKEY:.          
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b860: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b870: 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20  _FOREIGNKEY";   
b880: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b890: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b8a0: 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61  INT_CHECK:   zNa
b8b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b8c0: 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20  STRAINT_CHECK"; 
b8d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b8e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b8f0: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a  AINT_PRIMARYKEY:
b900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b930: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
b940: 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b  ARYKEY";   break
b950: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b960: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
b970: 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20  OTNULL: zName = 
b980: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b990: 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61  NT_NOTNULL";brea
b9a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b9b0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b9c0: 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20  COMMITHOOK:.    
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b9f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
ba00: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
ba10: 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  K";   break;.   
ba20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
ba30: 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20  ONSTRAINT_VTAB: 
ba40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ba50: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54  TE_CONSTRAINT_VT
ba60: 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  AB";   break;.  
ba70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ba80: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
ba90: 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ION:.           
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bac0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bad0: 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62  FUNCTION";     b
bae0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
baf0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
bb00: 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d  NT_ROWID:   zNam
bb10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
bb20: 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20  TRAINT_ROWID";  
bb30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bb40: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
bb50: 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  H:           zNa
bb60: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53  me = "SQLITE_MIS
bb70: 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20 20  MATCH";         
bb80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bb90: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  se SQLITE_MISUSE
bba0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bbb0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
bbc0: 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20 20  SUSE";          
bbd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bbe0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ase SQLITE_NOLFS
bbf0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
bc00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
bc10: 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20 20  OLFS";          
bc20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bc30: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48  case SQLITE_AUTH
bc40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
bc50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bc60: 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 20 20  AUTH";          
bc70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bc80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52   case SQLITE_FOR
bc90: 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  MAT:            
bca0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bcb0: 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20  _FORMAT";       
bcc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bcd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41    case SQLITE_RA
bce0: 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  NGE:            
bcf0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bd00: 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20  E_RANGE";       
bd10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bd20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
bd30: 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20 20 20  OTADB:          
bd40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bd50: 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20  TE_NOTADB";     
bd60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bd70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bd80: 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROW:            
bd90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bda0: 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20  ITE_ROW";       
bdb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bdc0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bdd0: 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20  _NOTICE:        
bde0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bdf0: 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20  LITE_NOTICE";   
be00: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
be10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
be20: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
be30: 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  _WAL: zName = "S
be40: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
be50: 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b  OVER_WAL";break;
be60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be70: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
be80: 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20  R_ROLLBACK:.    
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
beb0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49  e = "SQLITE_NOTI
bec0: 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
bed0: 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACK"; break;.   
bee0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57     case SQLITE_W
bef0: 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20  ARNING:         
bf00: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bf10: 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20  TE_WARNING";    
bf20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bf30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bf40: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
bf50: 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  X:  zName = "SQL
bf60: 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f  ITE_WARNING_AUTO
bf70: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
bf80: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bf90: 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20  _DONE:          
bfa0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bfb0: 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20  LITE_DONE";     
bfc0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bfd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
bfe0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
bff0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 42 75 66  static char zBuf
c000: 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [50];.    sqlite
c010: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
c020: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
c030: 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25  SQLITE_UNKNOWN(%
c040: 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20  d)", origRc);.  
c050: 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a    zName = zBuf;.
c060: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
c070: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
c080: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61  .** Return a sta
c090: 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20  tic string that 
c0a0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
c0b0: 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
c0c0: 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
c0d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e  argument..*/.con
c0e0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
c0f0: 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a  ErrStr(int rc){.
c100: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
c110: 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b  har* const aMsg[
c120: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ] = {.    /* SQL
c130: 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  ITE_OK          
c140: 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72  */ "not an error
c150: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c160: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20  _ERROR       */ 
c170: 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72  "SQL logic error
c180: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c190: 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20  _INTERNAL    */ 
c1a0: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
c1b0: 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20  _PERM        */ 
c1c0: 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69  "access permissi
c1d0: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
c1e0: 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  /* SQLITE_ABORT 
c1f0: 20 20 20 20 20 20 2a 2f 20 22 71 75 65 72 79 20        */ "query 
c200: 61 62 6f 72 74 65 64 22 2c 0a 20 20 20 20 2f 2a  aborted",.    /*
c210: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20   SQLITE_BUSY    
c220: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c230: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
c240: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   /* SQLITE_LOCKE
c250: 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  D      */ "datab
c260: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
c270: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
c280: 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20  ITE_NOMEM       
c290: 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  */ "out of memor
c2a0: 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  y",.    /* SQLIT
c2b0: 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f  E_READONLY    */
c2c0: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69   "attempt to wri
c2d0: 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61  te a readonly da
c2e0: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
c2f0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
c300: 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74     */ "interrupt
c310: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c320: 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a  TE_IOERR       *
c330: 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  / "disk I/O erro
c340: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
c350: 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f  E_CORRUPT     */
c360: 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   "database disk 
c370: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
c380: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c390: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a  TE_NOTFOUND    *
c3a0: 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61  / "unknown opera
c3b0: 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51  tion",.    /* SQ
c3c0: 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20  LITE_FULL       
c3d0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72   */ "database or
c3e0: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a   disk is full",.
c3f0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41      /* SQLITE_CA
c400: 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e  NTOPEN    */ "un
c410: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
c420: 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20  abase file",.   
c430: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f   /* SQLITE_PROTO
c440: 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69  COL    */ "locki
c450: 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20  ng protocol",.  
c460: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54    /* SQLITE_EMPT
c470: 59 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20  Y       */ 0,.  
c480: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45    /* SQLITE_SCHE
c490: 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  MA      */ "data
c4a0: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
c4b0: 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a  changed",.    /*
c4c0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20   SQLITE_TOOBIG  
c4d0: 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f      */ "string o
c4e0: 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c  r blob too big",
c4f0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
c500: 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63  ONSTRAINT  */ "c
c510: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
c520: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c530: 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20  _MISMATCH    */ 
c540: 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  "datatype mismat
c550: 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ch",.    /* SQLI
c560: 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a  TE_MISUSE      *
c570: 2f 20 22 62 61 64 20 70 61 72 61 6d 65 74 65 72  / "bad parameter
c580: 20 6f 72 20 6f 74 68 65 72 20 41 50 49 20 6d 69   or other API mi
c590: 73 75 73 65 22 2c 0a 23 69 66 64 65 66 20 53 51  suse",.#ifdef SQ
c5a0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
c5b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
c5c0: 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c  OLFS       */ "l
c5d0: 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72  arge file suppor
c5e0: 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a  t is disabled",.
c5f0: 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53 51 4c  #else.    /* SQL
c600: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
c610: 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20 20 20  */ 0,.#endif.   
c620: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20   /* SQLITE_AUTH 
c630: 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f         */ "autho
c640: 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22  rization denied"
c650: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c660: 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 30  FORMAT      */ 0
c670: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c680: 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22  RANGE       */ "
c690: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
c6a0: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
c6b0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
c6c0: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
c6d0: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
c6e0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c6f0: 5f 4e 4f 54 49 43 45 20 20 20 20 20 20 2a 2f 20  _NOTICE      */ 
c700: 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 6d 65  "notification me
c710: 73 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  ssage",.    /* S
c720: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20 20 20  QLITE_WARNING   
c730: 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20 6d 65    */ "warning me
c740: 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  ssage",.  };.  c
c750: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
c760: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
c770: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
c780: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
c790: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
c7a0: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
c7b0: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
c7c0: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
c7d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c7e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
c7f0: 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  W: {.      zErr 
c800: 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f 77 20 61  = "another row a
c810: 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20 20  vailable";.     
c820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c830: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
c840: 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72  NE: {.      zErr
c850: 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f 77 73   = "no more rows
c860: 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20   available";.   
c870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c880: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
c890: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
c8a0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
c8b0: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
c8c0: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
c8d0: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
c8e0: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
c8f0: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
c900: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
c910: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c920: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
c930: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
c940: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
c950: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
c960: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
c970: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
c980: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
c990: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
c9a0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
c9b0: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
c9c0: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
c9d0: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
c9e0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
c9f0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52  rgument..**.** R
ca00: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  eturn non-zero t
ca10: 6f 20 72 65 74 72 79 20 74 68 65 20 6c 6f 63 6b  o retry the lock
ca20: 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 74  .  Return zero t
ca30: 6f 20 73 74 6f 70 20 74 72 79 69 6e 67 0a 2a 2a  o stop trying.**
ca40: 20 61 6e 64 20 63 61 75 73 65 20 53 51 4c 69 74   and cause SQLit
ca50: 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  e to return SQLI
ca60: 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74 61 74  TE_BUSY..*/.stat
ca70: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
ca80: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
ca90: 28 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c 20 20  (.  void *ptr,  
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cab0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
cac0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  ion */.  int cou
cad0: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
cae0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
caf0: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
cb00: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 73 71  een busy */.  sq
cb10: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
cb20: 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  e      /* The fi
cb30: 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20  le on which the 
cb40: 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64 20 2a 2f  lock occurred */
cb50: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
cb60: 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53  S_WIN || HAVE_US
cb70: 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69 73 20 63  LEEP.  /* This c
cb80: 61 73 65 20 69 73 20 66 6f 72 20 73 79 73 74 65  ase is for syste
cb90: 6d 73 20 74 68 61 74 20 68 61 76 65 20 73 75 70  ms that have sup
cba0: 70 6f 72 74 20 66 6f 72 20 73 6c 65 65 70 69 6e  port for sleepin
cbb0: 67 20 66 6f 72 20 66 72 61 63 74 69 6f 6e 73 20  g for fractions 
cbc0: 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64  of.  ** a second
cbd0: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20 41 6c  .  Examples:  Al
cbe0: 6c 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  l windows system
cbf0: 73 2c 20 75 6e 69 78 20 73 79 73 74 65 6d 73 20  s, unix systems 
cc00: 77 69 74 68 20 75 73 6c 65 65 70 28 29 20 2a 2f  with usleep() */
cc10: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
cc20: 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20  u8 delays[] =.  
cc30: 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30     { 1, 2, 5, 10
cc40: 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35  , 15, 20, 25, 25
cc50: 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c  ,  25,  50,  50,
cc60: 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63   100 };.  static
cc70: 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73   const u8 totals
cc80: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31  [] =.     { 0, 1
cc90: 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c  , 3,  8, 18, 33,
cca0: 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32   53, 78, 103, 12
ccb0: 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23  8, 178, 228 };.#
ccc0: 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41   define NDELAY A
ccd0: 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29  rraySize(delays)
cce0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
ccf0: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
cd00: 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d 20 64  .  int tmout = d
cd10: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
cd20: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
cd30: 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  or;..#ifdef SQLI
cd40: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
cd50: 54 49 4d 45 4f 55 54 0a 20 20 69 66 28 20 73 71  TIMEOUT.  if( sq
cd60: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
cd70: 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54 45 5f  ol(pFile,SQLITE_
cd80: 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f  FCNTL_LOCK_TIMEO
cd90: 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51 4c 49  UT,&tmout)==SQLI
cda0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
cdb0: 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20   count ){.      
cdc0: 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20  tmout = 0;.     
cdd0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
cde0: 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51 4c  ntrol(pFile, SQL
cdf0: 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54  ITE_FCNTL_LOCK_T
ce00: 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74 29 3b  IMEOUT, &tmout);
ce10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
ce20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ce30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
ce40: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
ce50: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
ce60: 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  File);.#endif.  
ce70: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
ce80: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
ce90: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
cea0: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
ceb0: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
cec0: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
ced0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
cee0: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
cef0: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
cf00: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
cf10: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
cf20: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
cf30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
cf40: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d 6f 75  r + delay > tmou
cf50: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
cf60: 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a   tmout - prior;.
cf70: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
cf80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
cf90: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
cfa0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
cfb0: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
cfc0: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  n 1;.#else.  /* 
cfd0: 54 68 69 73 20 63 61 73 65 20 66 6f 72 20 75 6e  This case for un
cfe0: 69 78 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  ix systems that 
cff0: 6c 61 63 6b 20 75 73 6c 65 65 70 28 29 20 73 75  lack usleep() su
d000: 70 70 6f 72 74 2e 20 20 53 6c 65 65 70 69 6e 67  pport.  Sleeping
d010: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 64 6f  .  ** must be do
d020: 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ne in increments
d030: 20 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f 6e 64   of whole second
d040: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
d050: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
d060: 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74  ptr;.  int tmout
d070: 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70   = ((sqlite3 *)p
d080: 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74  tr)->busyTimeout
d090: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
d0a0: 45 54 45 52 28 70 46 69 6c 65 29 3b 0a 20 20 69  ETER(pFile);.  i
d0b0: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
d0c0: 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20 20 20  0 > tmout ){.   
d0d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d0e0: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
d0f0: 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30  db->pVfs, 100000
d100: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
d110: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
d120: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
d130: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a   busy handler..*
d140: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d150: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
d160: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61   an operation fa
d170: 69 6c 65 64 20 74 6f 20 61 63 71 75 69 72 65 20  iled to acquire 
d180: 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56 46 53  a.** lock on VFS
d190: 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a 2a 0a   file pFile..**.
d1a0: 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
d1b0: 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ne returns non-z
d1c0: 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
d1d0: 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69 74   retried.  If it
d1e0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74  .** returns 0, t
d1f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f  he operation abo
d200: 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49  rts with an SQLI
d210: 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a  TE_BUSY error..*
d220: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76  /.int sqlite3Inv
d230: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42  okeBusyHandler(B
d240: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c 20 73  usyHandler *p, s
d250: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
d260: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
d270: 20 69 66 28 20 70 2d 3e 78 42 75 73 79 48 61 6e   if( p->xBusyHan
d280: 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42  dler==0 || p->nB
d290: 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30  usy<0 ) return 0
d2a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45 78 74 72  ;.  if( p->bExtr
d2b0: 61 46 69 6c 65 41 72 67 20 29 7b 0a 20 20 20 20  aFileArg ){.    
d2c0: 2f 2a 20 41 64 64 20 61 6e 20 65 78 74 72 61 20  /* Add an extra 
d2d0: 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74  parameter with t
d2e0: 68 65 20 70 46 69 6c 65 20 70 6f 69 6e 74 65 72  he pFile pointer
d2f0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
d300: 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61  he.    ** callba
d310: 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74  ck argument list
d320: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a 78 54   */.    int (*xT
d330: 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71  ra)(void*,int,sq
d340: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 20 20  lite3_file*);.  
d350: 20 20 78 54 72 61 20 3d 20 28 69 6e 74 28 2a 29    xTra = (int(*)
d360: 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c 69 74  (void*,int,sqlit
d370: 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78 42 75  e3_file*))p->xBu
d380: 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 72  syHandler;.    r
d390: 63 20 3d 20 78 54 72 61 28 70 2d 3e 70 42 75 73  c = xTra(p->pBus
d3a0: 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 2c 20  yArg, p->nBusy, 
d3b0: 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  pFile);.  }else{
d3c0: 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63 79 20 73  .    /* Legacy s
d3d0: 74 79 6c 65 20 62 75 73 79 20 68 61 6e 64 6c 65  tyle busy handle
d3e0: 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  r callback */.  
d3f0: 20 20 72 63 20 3d 20 70 2d 3e 78 42 75 73 79 48    rc = p->xBusyH
d400: 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73 79 41  andler(p->pBusyA
d410: 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20  rg, p->nBusy);. 
d420: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29   }.  if( rc==0 )
d430: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d  {.    p->nBusy =
d440: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
d450: 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20    p->nBusy++;.  
d460: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a  }.  return rc; .
d470: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d480: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62  utine sets the b
d490: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  usy callback for
d4a0: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
d4b0: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
d4c0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
d4d0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
d4e0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  iven argument..*
d4f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
d500: 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  sy_handler(.  sq
d510: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
d520: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
d530: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
d540: 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  rg.){.#ifdef SQL
d550: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
d560: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
d570: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
d580: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
d590: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
d5a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
d5b0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d5c0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
d5d0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 42 75  >busyHandler.xBu
d5e0: 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
d5f0: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
d600: 64 6c 65 72 2e 70 42 75 73 79 41 72 67 20 3d 20  dler.pBusyArg = 
d610: 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79  pArg;.  db->busy
d620: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
d630: 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  0;.  db->busyHan
d640: 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c 65 41  dler.bExtraFileA
d650: 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75  rg = 0;.  db->bu
d660: 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20  syTimeout = 0;. 
d670: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d680: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d690: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d6a0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
d6b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
d6c0: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a  RESS_CALLBACK./*
d6d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d6e0: 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65   sets the progre
d6f0: 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ss callback for 
d700: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
d710: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
d720: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
d730: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
d740: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  ven argument. Th
d750: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
d760: 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69  ack will.** be i
d770: 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70  nvoked every nOp
d780: 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f  s opcodes..*/.vo
d790: 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72  id sqlite3_progr
d7a0: 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  ess_handler(.  s
d7b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
d7c0: 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28  nt nOps,.  int (
d7d0: 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64  *xProgress)(void
d7e0: 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72  *), .  void *pAr
d7f0: 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  g.){.#ifdef SQLI
d800: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
d810: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
d820: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
d830: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
d840: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
d850: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
d860: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
d870: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d880: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d890: 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20  if( nOps>0 ){.  
d8a0: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
d8b0: 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20  = xProgress;.   
d8c0: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
d8d0: 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f  s = (unsigned)nO
d8e0: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
d8f0: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
d900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
d910: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
d920: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
d930: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
d940: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
d950: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
d960: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
d970: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
d980: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
d990: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
d9a0: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
d9b0: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
d9c0: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
d9d0: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
d9e0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
d9f0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
da00: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
da10: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
da20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
da30: 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   ms){.#ifdef SQL
da40: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
da50: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
da60: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
da70: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
da80: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
da90: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d  ;.#endif.  if( m
daa0: 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  s>0 ){.    sqlit
dab0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
dac0: 64 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f 69 64  db, (int(*)(void
dad0: 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65 44 65 66  *,int))sqliteDef
dae0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
daf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
db10: 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64  void*)db);.    d
db20: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
db30: 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73   ms;.    db->bus
db40: 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46  yHandler.bExtraF
db50: 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20 7d 65  ileArg = 1;.  }e
db60: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
db70: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
db80: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
db90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20  .}../*.** Cause 
dbb0: 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72  any pending oper
dbc0: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74  ation to stop at
dbd0: 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70   its earliest op
dbe0: 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f  portunity..*/.vo
dbf0: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  id sqlite3_inter
dc00: 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62  rupt(sqlite3 *db
dc10: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
dc20: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
dc30: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
dc40: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
dc50: 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20 64  ) && (db==0 || d
dc60: 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45  b->magic!=SQLITE
dc70: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20 29  _MAGIC_ZOMBIE) )
dc80: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
dc90: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
dca0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
dcb0: 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e  #endif.  db->u1.
dcc0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
dcd0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
dce0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
dcf0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
dd00: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
dd10: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
dd20: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
dd30: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
dd40: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
dd50: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
dd60: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
dd70: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
dd80: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
dd90: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
dda0: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
ddb0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
ddc0: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
ddd0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
dde0: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
ddf0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
de00: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
de10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
de20: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
de30: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
de40: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
de50: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
de60: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
de70: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
de80: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
de90: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
dea0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
deb0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
dec0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
ded0: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
dee0: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
def0: 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c  id (*xValue)(sql
df00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
df10: 20 20 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73    void (*xInvers
df20: 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  e)(sqlite3_conte
df30: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
df40: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 46 75 6e  value **),.  Fun
df50: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
df60: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
df70: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
df80: 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74  nName;.  int ext
df90: 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65  raFlags;..  asse
dfa0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
dfb0: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
dfc0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 78  ) );.  assert( x
dfd0: 56 61 6c 75 65 3d 3d 30 20 7c 7c 20 78 53 46 75  Value==0 || xSFu
dfe0: 6e 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  nc==0 );.  if( z
dff0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e010: 2a 20 4d 75 73 74 20 68 61 76 65 20 61 20 76 61  * Must have a va
e020: 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 7c  lid name */.   |
e030: 7c 20 28 78 53 46 75 6e 63 21 3d 30 20 26 26 20  | (xSFunc!=0 && 
e040: 78 46 69 6e 61 6c 21 3d 30 29 20 20 20 20 20 20  xFinal!=0)      
e050: 20 20 2f 2a 20 4e 6f 74 20 62 6f 74 68 20 78 53    /* Not both xS
e060: 46 75 6e 63 20 61 6e 64 20 78 46 69 6e 61 6c 20  Func and xFinal 
e070: 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 46 69 6e 61  */.   || ((xFina
e080: 6c 3d 3d 30 29 21 3d 28 78 53 74 65 70 3d 3d 30  l==0)!=(xStep==0
e090: 29 29 20 20 20 20 20 20 20 2f 2a 20 42 6f 74 68  ))       /* Both
e0a0: 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66 20 78   or neither of x
e0b0: 46 69 6e 61 6c 20 61 6e 64 20 78 53 74 65 70 20  Final and xStep 
e0c0: 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 56 61 6c 75  */.   || ((xValu
e0d0: 65 3d 3d 30 29 21 3d 28 78 49 6e 76 65 72 73 65  e==0)!=(xInverse
e0e0: 3d 3d 30 29 29 20 20 20 20 2f 2a 20 42 6f 74 68  ==0))    /* Both
e0f0: 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66 20 78   or neither of x
e100: 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 20  Value, xInverse 
e110: 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41 72 67 3c 2d  */.   || (nArg<-
e120: 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45  1 || nArg>SQLITE
e130: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
e140: 47 29 0a 20 20 20 7c 7c 20 28 32 35 35 3c 28 6e  G).   || (255<(n
e150: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
e160: 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f  rlen30( zFunctio
e170: 6e 4e 61 6d 65 29 29 29 0a 20 20 29 7b 0a 20 20  nName))).  ){.  
e180: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e190: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
e1a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
e1b0: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54  TE_FUNC_CONSTANT
e1c0: 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  ==SQLITE_DETERMI
e1d0: 4e 49 53 54 49 43 20 29 3b 0a 20 20 61 73 73 65  NISTIC );.  asse
e1e0: 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
e1f0: 44 49 52 45 43 54 3d 3d 53 51 4c 49 54 45 5f 44  DIRECT==SQLITE_D
e200: 49 52 45 43 54 4f 4e 4c 59 20 29 3b 0a 20 20 65  IRECTONLY );.  e
e210: 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20  xtraFlags = enc 
e220: 26 20 20 28 53 51 4c 49 54 45 5f 44 45 54 45 52  &  (SQLITE_DETER
e230: 4d 49 4e 49 53 54 49 43 7c 53 51 4c 49 54 45 5f  MINISTIC|SQLITE_
e240: 44 49 52 45 43 54 4f 4e 4c 59 7c 53 51 4c 49 54  DIRECTONLY|SQLIT
e250: 45 5f 53 55 42 54 59 50 45 29 3b 0a 20 20 65 6e  E_SUBTYPE);.  en
e260: 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e  c &= (SQLITE_FUN
e270: 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45  C_ENCMASK|SQLITE
e280: 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65  _ANY);.  .#ifnde
e290: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
e2a0: 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  F16.  /* If SQLI
e2b0: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
e2c0: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
e2d0: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
e2e0: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
e2f0: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
e300: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
e310: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
e320: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
e330: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
e340: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
e350: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
e360: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ernally..  **.  
e370: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59  ** If SQLITE_ANY
e380: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61   is specified, a
e390: 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e  dd three version
e3a0: 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  s of the functio
e3b0: 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61  n.  ** to the ha
e3c0: 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  sh table..  */. 
e3d0: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
e3e0: 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e  _UTF16 ){.    en
e3f0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
e400: 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20  NATIVE;.  }else 
e410: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
e420: 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ANY ){.    int r
e430: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
e440: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
e450: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
e460: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
e470: 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  F8|extraFlags,. 
e480: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
e490: 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  a, xSFunc, xStep
e4a0: 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65  , xFinal, xValue
e4b0: 2c 20 78 49 6e 76 65 72 73 65 2c 20 70 44 65 73  , xInverse, pDes
e4c0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  tructor);.    if
e4d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e4e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
e4f0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
e500: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
e510: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
e520: 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61  UTF16LE|extraFla
e530: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55  gs,.          pU
e540: 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c  serData, xSFunc,
e550: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
e560: 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65  xValue, xInverse
e570: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
e580: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
e590: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e5a0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e5b0: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
e5c0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
e5d0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
e5e0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
e5f0: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
e600: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
e610: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
e620: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
e630: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
e640: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
e650: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
e660: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
e670: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
e680: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
e690: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
e6a0: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
e6b0: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
e6c0: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
e6d0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
e6e0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
e6f0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
e700: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
e710: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
e720: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
e730: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
e740: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  ionName, nArg, (
e750: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
e760: 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46  ( p && (p->funcF
e770: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
e780: 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 28 75 33  NC_ENCMASK)==(u3
e790: 32 29 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67  2)enc && p->nArg
e7a0: 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  ==nArg ){.    if
e7b0: 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
e7c0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
e7d0: 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
e7e0: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
e7f0: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
e800: 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
e810: 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20  y user-function 
e820: 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
e830: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
e840: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
e850: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
e860: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e870: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
e880: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
e890: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
e8a0: 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29  tatements(db, 0)
e8b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
e8c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
e8d0: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
e8e0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
e8f0: 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61  (u8)enc, 1);.  a
e900: 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d  ssert(p || db->m
e910: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20  allocFailed);.  
e920: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
e930: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e940: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  M_BKPT;.  }..  /
e950: 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65  * If an older ve
e960: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e  rsion of the fun
e970: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e  ction with a con
e980: 66 69 67 75 72 65 64 20 64 65 73 74 72 75 63 74  figured destruct
e990: 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67  or is.  ** being
e9a0: 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65   replaced invoke
e9b0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
e9c0: 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a  function here. *
e9d0: 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  /.  functionDest
e9e0: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69  roy(db, p);..  i
e9f0: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
ea00: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
ea10: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
ea20: 20 70 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f   p->u.pDestructo
ea30: 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b  r = pDestructor;
ea40: 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  .  p->funcFlags 
ea50: 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  = (p->funcFlags 
ea60: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
ea70: 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c  CMASK) | extraFl
ea80: 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ags;.  testcase(
ea90: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20   p->funcFlags & 
eaa0: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
eab0: 53 54 49 43 20 29 3b 0a 20 20 74 65 73 74 63 61  STIC );.  testca
eac0: 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  se( p->funcFlags
ead0: 20 26 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54   & SQLITE_DIRECT
eae0: 4f 4e 4c 59 20 29 3b 0a 20 20 70 2d 3e 78 53 46  ONLY );.  p->xSF
eaf0: 75 6e 63 20 3d 20 78 53 46 75 6e 63 20 3f 20 78  unc = xSFunc ? x
eb00: 53 46 75 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20  SFunc : xStep;. 
eb10: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
eb20: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 78 56 61  xFinal;.  p->xVa
eb30: 6c 75 65 20 3d 20 78 56 61 6c 75 65 3b 0a 20 20  lue = xValue;.  
eb40: 70 2d 3e 78 49 6e 76 65 72 73 65 20 3d 20 78 49  p->xInverse = xI
eb50: 6e 76 65 72 73 65 3b 0a 20 20 70 2d 3e 70 55 73  nverse;.  p->pUs
eb60: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
eb70: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
eb80: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
eb90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
eba0: 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 65 72 20 66  ../*.** Worker f
ebb0: 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20  unction used by 
ebc0: 75 74 66 2d 38 20 41 50 49 73 20 74 68 61 74 20  utf-8 APIs that 
ebd0: 63 72 65 61 74 65 20 6e 65 77 20 66 75 6e 63 74  create new funct
ebe0: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73  ions:.**.**    s
ebf0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
ec00: 6e 63 74 69 6f 6e 28 29 0a 2a 2a 20 20 20 20 73  nction().**    s
ec10: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
ec20: 6e 63 74 69 6f 6e 5f 76 32 28 29 0a 2a 2a 20 20  nction_v2().**  
ec30: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
ec40: 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e  _window_function
ec50: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ().*/.static int
ec60: 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41   createFunctionA
ec70: 70 69 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pi(.  sqlite3 *d
ec80: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
ec90: 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41  *zFunc,.  int nA
eca0: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
ecb0: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
ecc0: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
ecd0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
ece0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
ecf0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
ed00: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
ed10: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
ed20: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
ed30: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
ed40: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
ed50: 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71  oid (*xValue)(sq
ed60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
ed70: 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e 76 65 72  .  void (*xInver
ed80: 73 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  se)(sqlite3_cont
ed90: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
eda0: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
edb0: 64 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69  d(*xDestroy)(voi
edc0: 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  d*).){.  int rc 
edd0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
ede0: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
edf0: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66   *pArg = 0;..#if
ee00: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ee10: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
ee20: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
ee30: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
ee40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ee50: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
ee60: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
ee70: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
ee80: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
ee90: 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20   xDestroy ){.   
eea0: 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73   pArg = (FuncDes
eeb0: 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65  tructor *)sqlite
eec0: 33 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46  3Malloc(sizeof(F
eed0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b  uncDestructor));
eee0: 0a 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29  .    if( !pArg )
eef0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
ef00: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
ef10: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
ef20: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
ef30: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
ef40: 6e 52 65 66 20 3d 20 30 3b 0a 20 20 20 20 70 41  nRef = 0;.    pA
ef50: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
ef60: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
ef70: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
ef80: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
ef90: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
efa0: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
efb0: 65 6e 63 2c 20 70 2c 20 0a 20 20 20 20 20 20 78  enc, p, .      x
efc0: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  SFunc, xStep, xF
efd0: 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49  inal, xValue, xI
efe0: 6e 76 65 72 73 65 2c 20 70 41 72 67 0a 20 20 29  nverse, pArg.  )
eff0: 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ;.  if( pArg && 
f000: 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  pArg->nRef==0 ){
f010: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
f020: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
f030: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
f040: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f050: 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74  pArg);.  }.. out
f060: 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  :.  rc = sqlite3
f070: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
f080: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f090: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
f0a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f0b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
f0c0: 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f  new user functio
f0d0: 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
f0e0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f0f0: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
f100: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
f110: 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41  *zFunc,.  int nA
f120: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
f130: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
f140: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
f150: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
f160: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
f170: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
f180: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
f190: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
f1a0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
f1b0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
f1c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
f1d0: 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61 74 65  .  return create
f1e0: 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20  FunctionApi(db, 
f1f0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
f200: 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  , p, xSFunc, xSt
f210: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f230: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
f240: 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  0, 0, 0);.}.int 
f250: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
f260: 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  unction_v2(.  sq
f270: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
f280: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
f290: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
f2a0: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
f2b0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e  ,.  void (*xSFun
f2c0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
f2d0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
f2e0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
f2f0: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
f300: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
f310: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
f320: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
f330: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
f340: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
f350: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
f360: 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72  ).){.  return cr
f370: 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28  eateFunctionApi(
f380: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
f390: 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c   enc, p, xSFunc,
f3a0: 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20   xStep,.        
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e              xFin
f3d0: 61 6c 2c 20 30 2c 20 30 2c 20 78 44 65 73 74 72  al, 0, 0, xDestr
f3e0: 6f 79 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  oy);.}.int sqlit
f3f0: 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77  e3_create_window
f400: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
f410: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
f420: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
f430: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
f440: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
f450: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
f460: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f470: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
f480: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
f490: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
f4a0: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
f4b0: 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71  oid (*xValue)(sq
f4c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
f4d0: 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e 76 65 72  .  void (*xInver
f4e0: 73 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  se)(sqlite3_cont
f4f0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
f500: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
f510: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
f520: 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 72 65 74 75  oid *).){.  retu
f530: 72 6e 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f  rn createFunctio
f540: 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20  nApi(db, zFunc, 
f550: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 30 2c  nArg, enc, p, 0,
f560: 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20   xStep,.        
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e              xFin
f590: 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76  al, xValue, xInv
f5a0: 65 72 73 65 2c 20 78 44 65 73 74 72 6f 79 29 3b  erse, xDestroy);
f5b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f5c0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
f5d0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
f5e0: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
f5f0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
f600: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
f610: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
f620: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
f630: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
f640: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
f650: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f660: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
f670: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
f680: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
f690: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
f6a0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
f6b0: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
f6c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f6d0: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
f6e0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a   char *zFunc8;..
f6f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f700: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
f710: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
f720: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
f730: 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  | zFunctionName=
f740: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
f750: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f760: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f770: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f780: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
f790: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
f7a0: 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38  iled );.  zFunc8
f7b0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
f7c0: 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  o8(db, zFunction
f7d0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
f7e0: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
f7f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
f800: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
f810: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
f820: 65 70 2c 20 70 2c 20 78 53 46 75 6e 63 2c 78 53  ep, p, xSFunc,xS
f830: 74 65 70 2c 78 46 69 6e 61 6c 2c 30 2c 30 2c 30  tep,xFinal,0,0,0
f840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
f850: 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a  ee(db, zFunc8);.
f860: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
f870: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
f880: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f890: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
f8a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f8b0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
f8c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
f8d0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
f8e0: 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 20 66 75 6e  on of an SQL fun
f8f0: 63 74 69 6f 6e 20 74 68 61 74 20 61 6c 77 61 79  ction that alway
f900: 73 0a 2a 2a 20 66 61 69 6c 73 20 77 69 74 68 20  s.** fails with 
f910: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
f920: 20 73 74 61 74 69 6e 67 20 74 68 61 74 20 74 68   stating that th
f930: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  e function is us
f940: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 77 72 6f  ed in the.** wro
f950: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65  ng context.  The
f960: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
f970: 64 5f 66 75 6e 63 74 69 6f 6e 28 29 20 41 50 49  d_function() API
f980: 20 6d 69 67 68 74 20 63 6f 6e 73 74 72 75 63 74   might construct
f990: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  .** SQL function
f9a0: 20 74 68 61 74 20 75 73 65 20 74 68 69 73 20 72   that use this r
f9b0: 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 74  outine so that t
f9c0: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 6c  he functions wil
f9d0: 6c 20 65 78 69 73 74 0a 2a 2a 20 66 6f 72 20 6e  l exist.** for n
f9e0: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 62  ame resolution b
f9f0: 75 74 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ut are actually 
fa00: 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 74 68  overloaded by th
fa10: 65 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 0a  e xFindFunction.
fa20: 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 76 69 72  ** method of vir
fa30: 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  tual tables..*/.
fa40: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
fa50: 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69  te3InvalidFuncti
fa60: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
fa70: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
fa80: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
fa90: 20 63 61 6c 6c 69 6e 67 20 63 6f 6e 74 65 78 74   calling context
faa0: 20 2a 2f 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65   */.  int NotUse
fab0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
fac0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
fad0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
fae0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  unction */.  sql
faf0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74  ite3_value **Not
fb00: 55 73 65 64 32 20 20 20 2f 2a 20 56 61 6c 75 65  Used2   /* Value
fb10: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
fb20: 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  t */.){.  const 
fb30: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
fb40: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
fb50: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
fb60: 74 65 78 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a  text);.  char *z
fb70: 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Err;.  UNUSED_PA
fb80: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
fb90: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 7a  , NotUsed2);.  z
fba0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
fbb0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 75 6e  rintf(.      "un
fbc0: 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63  able to use func
fbd0: 74 69 6f 6e 20 25 73 20 69 6e 20 74 68 65 20 72  tion %s in the r
fbe0: 65 71 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74  equested context
fbf0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  ", zName);.  sql
fc00: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
fc10: 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c  r(context, zErr,
fc20: 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   -1);.  sqlite3_
fc30: 66 72 65 65 28 7a 45 72 72 29 3b 0a 7d 0a 0a 2f  free(zErr);.}../
fc40: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61  *.** Declare tha
fc50: 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  t a function has
fc60: 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64   been overloaded
fc70: 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61   by a virtual ta
fc80: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
fc90: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61  e function alrea
fca0: 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72  dy exists as a r
fcb0: 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75  egular global fu
fcc0: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20  nction, then.** 
fcd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fce0: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65  a no-op.  If the
fcf0: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
fd00: 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63  ot exist, then c
fd10: 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f  reate.** a new o
fd20: 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74  ne that always t
fd30: 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65  hrows a run-time
fd40: 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20   error.  .**.** 
fd50: 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62  When virtual tab
fd60: 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72  les intend to pr
fd70: 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61  ovide an overloa
fd80: 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  ded function, th
fd90: 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c  ey.** should cal
fda0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  l this routine t
fdb0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
fdc0: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
fdd0: 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f  exists..** A glo
fde0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  bal function mus
fdf0: 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72  t exist in order
fe00: 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75   for name resolu
fe10: 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20  tion to work.** 
fe20: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74  properly..*/.int
fe30: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
fe40: 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  d_function(.  sq
fe50: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
fe60: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
fe70: 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20    int nArg.){.  
fe80: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
fe90: 7a 43 6f 70 79 3b 0a 0a 23 69 66 64 65 66 20 53  zCopy;..#ifdef S
fea0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
feb0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
fec0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
fed0: 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d  Ok(db) || zName=
fee0: 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b  =0 || nArg<-2 ){
fef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ff00: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
ff10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
ff20: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ff30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ff40: 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
ff50: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
ff60: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
ff70: 55 54 46 38 2c 20 30 29 21 3d 30 3b 0a 20 20 73  UTF8, 0)!=0;.  s
ff80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ff90: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
ffa0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ffb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7a 43   SQLITE_OK;.  zC
ffc0: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  opy = sqlite3_mp
ffd0: 72 69 6e 74 66 28 7a 4e 61 6d 65 29 3b 0a 20 20  rintf(zName);.  
ffe0: 69 66 28 20 7a 43 6f 70 79 3d 3d 30 20 29 20 72  if( zCopy==0 ) r
fff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10000 45 4d 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  EM;.  return sql
10010 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
10020 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d  tion_v2(db, zNam
10030 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
10040 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20  UTF8,.          
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 7a 43 6f 70 79 2c 20 73 71 6c 69 74 65 33 49   zCopy, sqlite3I
10070 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20  nvalidFunction, 
10080 30 2c 20 30 2c 20 73 71 6c 69 74 65 33 5f 66 72  0, 0, sqlite3_fr
10090 65 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ee);.}..#ifndef 
100a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
100b0 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  E./*.** Register
100c0 20 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f   a trace functio
100d0 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
100e0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
100f0 20 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63   registered trac
10100 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
10110 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
10120 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20   trace function 
10130 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72  means that no tr
10140 61 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  acing is execute
10150 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
10160 2a 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69  * trace is a poi
10170 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
10180 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
10190 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
101a0 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73  of each.** SQL s
101b0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  tatement..*/.#if
101c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
101d0 5f 44 45 50 52 45 43 41 54 45 44 0a 76 6f 69 64  _DEPRECATED.void
101e0 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28   *sqlite3_trace(
101f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
10200 64 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a  d(*xTrace)(void*
10210 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76  ,const char*), v
10220 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f  oid *pArg){.  vo
10230 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
10240 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10250 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10260 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10270 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
10280 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
10290 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
102a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
102b0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
102c0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
102d0 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
102e0 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
102f0 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 78 54 72  db->mTrace = xTr
10300 61 63 65 20 3f 20 53 51 4c 49 54 45 5f 54 52 41  ace ? SQLITE_TRA
10310 43 45 5f 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20  CE_LEGACY : 0;. 
10320 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 28 69   db->xTrace = (i
10330 6e 74 28 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c  nt(*)(u32,void*,
10340 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 29 78 54 72  void*,void*))xTr
10350 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
10360 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
10370 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10380 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10390 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
103a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
103b0 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
103c0 20 2a 2f 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72   */../* Register
103d0 20 61 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63   a trace callbac
103e0 6b 20 75 73 69 6e 67 20 74 68 65 20 76 65 72 73  k using the vers
103f0 69 6f 6e 2d 32 20 69 6e 74 65 72 66 61 63 65 2e  ion-2 interface.
10400 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
10410 74 72 61 63 65 5f 76 32 28 0a 20 20 73 71 6c 69  trace_v2(.  sqli
10420 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 20 20 20 2f 2a 20 54 72 61 63 65 20         /* Trace 
10450 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
10460 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54  */.  unsigned mT
10470 72 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  race,           
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74  /* Mask of event
104a0 73 20 74 6f 20 62 65 20 74 72 61 63 65 64 20 2a  s to be traced *
104b0 2f 0a 20 20 69 6e 74 28 2a 78 54 72 61 63 65 29  /.  int(*xTrace)
104c0 28 75 6e 73 69 67 6e 65 64 2c 76 6f 69 64 2a 2c  (unsigned,void*,
104d0 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f  void*,void*),  /
104e0 2a 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e  * Callback to in
104f0 76 6f 6b 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  voke */.  void *
10500 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10520 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
10530 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
10540 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10550 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
10560 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
10570 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
10580 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
10590 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
105a0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
105b0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
105c0 78 29 3b 0a 20 20 69 66 28 20 6d 54 72 61 63 65  x);.  if( mTrace
105d0 3d 3d 30 20 29 20 78 54 72 61 63 65 20 3d 20 30  ==0 ) xTrace = 0
105e0 3b 0a 20 20 69 66 28 20 78 54 72 61 63 65 3d 3d  ;.  if( xTrace==
105f0 30 20 29 20 6d 54 72 61 63 65 20 3d 20 30 3b 0a  0 ) mTrace = 0;.
10600 20 20 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 6d    db->mTrace = m
10610 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 78 54 72  Trace;.  db->xTr
10620 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20  ace = xTrace;.  
10630 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20  db->pTraceArg = 
10640 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
10650 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10660 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
10680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10690 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
106a0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
106b0 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
106c0 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
106d0 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
106e0 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
106f0 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
10700 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
10710 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
10720 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
10730 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
10740 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
10750 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
10760 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
10770 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
10780 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
10790 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
107a0 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
107b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
107c0 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
107d0 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
107e0 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
107f0 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
10800 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
10810 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
10820 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
10830 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
10840 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
10850 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
10860 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
10870 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
10880 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
10890 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
108a0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
108b0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
108c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
108d0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
108e0 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
108f0 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64  pProfileArg;.  d
10900 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50  b->xProfile = xP
10910 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50  rofile;.  db->pP
10920 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67  rofileArg = pArg
10930 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65 20 26  ;.  db->mTrace &
10940 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4e  = SQLITE_TRACE_N
10950 4f 4e 4c 45 47 41 43 59 5f 4d 41 53 4b 3b 0a 20  ONLEGACY_MASK;. 
10960 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 66 69 6c   if( db->xProfil
10970 65 20 29 20 64 62 2d 3e 6d 54 72 61 63 65 20 7c  e ) db->mTrace |
10980 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 58  = SQLITE_TRACE_X
10990 50 52 4f 46 49 4c 45 3b 0a 20 20 73 71 6c 69 74  PROFILE;.  sqlit
109a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
109b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
109c0 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64  urn pOld;.}.#end
109d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
109e0 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a  T_DEPRECATED */.
109f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10a00 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a  _OMIT_TRACE */..
10a10 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
10a20 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
10a30 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
10a40 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
10a50 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
10a60 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
10a70 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
10a80 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
10a90 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
10aa0 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
10ab0 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
10ac0 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
10ad0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
10ae0 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
10af0 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
10b00 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
10b10 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
10b20 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
10b30 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
10b40 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
10b50 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
10b60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
10b70 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
10b80 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
10b90 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
10ba0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
10bb0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
10bc0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
10bd0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
10be0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
10bf0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
10c00 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
10c10 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
10c20 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
10c30 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
10c40 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20  ->pCommitArg;.  
10c50 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
10c60 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
10c70 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  .  db->pCommitAr
10c80 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
10c90 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10ca0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10cb0 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a  turn pOld;.}../*
10cc0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
10cd0 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
10ce0 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
10cf0 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
10d00 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
10d10 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
10d20 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
10d30 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
10d40 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65   *sqlite3_update
10d50 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
10d60 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10d70 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
10d80 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
10d90 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
10da0 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
10db0 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  id*,int,char con
10dc0 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20  st *,char const 
10dd0 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c  *,sqlite_int64),
10de0 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e00 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
10e10 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
10e20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69   void *pRet;..#i
10e30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10e40 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
10e50 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10e60 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
10e70 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
10e80 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
10e90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
10ea0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
10eb0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
10ec0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
10ed0 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
10ee0 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
10ef0 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
10f00 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
10f10 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
10f20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10f30 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
10f40 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
10f50 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
10f60 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
10f70 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
10f80 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
10f90 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
10fa0 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
10fb0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
10fc0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
10fd0 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
10fe0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11000 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
11010 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
11020 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
11030 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
11040 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
11050 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
11060 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
11070 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
11080 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
11090 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
110a0 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  et;..#ifdef SQLI
110b0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
110c0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
110d0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
110e0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
110f0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
11100 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
11110 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
11120 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
11130 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
11140 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f    pRet = db->pRo
11150 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d  llbackArg;.  db-
11160 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
11170 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
11180 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41    db->pRollbackA
11190 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
111a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
111b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
111c0 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
111d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
111e0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
111f0 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  OK./*.** Registe
11200 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
11210 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
11220 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70  time a row is up
11230 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74  dated,.** insert
11240 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73  ed or deleted us
11250 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
11260 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
11270 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70  .void *sqlite3_p
11280 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  reupdate_hook(. 
11290 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
112a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
112b0 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
112c0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
112d0 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62  /.  void(*xCallb
112e0 61 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f 2a  ack)(         /*
112f0 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
11300 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c  on */.    void*,
11310 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61  sqlite3*,int,cha
11320 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f  r const*,char co
11330 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74  nst*,sqlite3_int
11340 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  64,sqlite3_int64
11350 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11370 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63 6b  * First callback
11380 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
11390 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
113a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
113b0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
113c0 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50 72    pRet = db->pPr
113d0 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62  eUpdateArg;.  db
113e0 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
113f0 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
11400 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61  ;.  db->pPreUpda
11410 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
11420 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
11430 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
11440 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
11450 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11460 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
11470 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e  TE_HOOK */..#ifn
11480 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11490 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
114a0 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
114b0 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
114c0 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
114d0 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
114e0 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
114f0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
11500 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
11510 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
11520 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
11530 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
11540 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
11550 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
11560 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
11570 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
11580 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
11590 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
115a0 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
115b0 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
115c0 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
115d0 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
115e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
115f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
11600 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
11610 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
11620 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
11630 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
11640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
11650 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
11660 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
11670 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
11680 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
11690 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
116a0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
116b0 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
116c0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
116d0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
116e0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
116f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11700 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
11710 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11720 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
11730 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
11740 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
11750 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
11760 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
11770 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
11780 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
11790 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
117a0 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
117b0 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
117c0 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
117d0 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
117e0 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
117f0 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
11800 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
11810 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
11820 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
11830 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
11840 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
11850 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
11860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
11870 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
11880 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
11890 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
118a0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
118b0 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
118c0 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
118d0 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
118e0 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
118f0 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
11900 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
11910 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
11920 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
11930 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
11940 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
11950 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
11960 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
11970 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
11980 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
11990 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
119a0 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
119b0 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
119c0 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66  e);.#else.#ifdef
119d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
119e0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
119f0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
11a00 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
11a10 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
11a20 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69  BKPT;.#endif.  i
11a30 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20  f( nFrame>0 ){. 
11a40 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
11a50 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57  ook(db, sqlite3W
11a60 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53  alDefaultHook, S
11a70 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
11a80 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c  (nFrame));.  }el
11a90 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
11aa0 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20  wal_hook(db, 0, 
11ab0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
11ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11ad0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
11ae0 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
11af0 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
11b00 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
11b10 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e  ction is written
11b20 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69  .** into the wri
11b30 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20  te-ahead-log by 
11b40 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
11b50 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
11b60 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  d *sqlite3_wal_h
11b70 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
11b80 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
11b90 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
11ba0 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
11bb0 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  s db handle */. 
11bc0 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29   int(*xCallback)
11bd0 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33  (void *, sqlite3
11be0 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
11bf0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
11c00 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
11c10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11c20 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
11c30 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20   to xCallback() 
11c40 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
11c50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
11c60 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64  void *pRet;.#ifd
11c70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11c80 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
11c90 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
11ca0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
11cb0 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
11cc0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
11cd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
11ce0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
11cf0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
11d00 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
11d10 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64  db->pWalArg;.  d
11d20 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20  b->xWalCallback 
11d30 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
11d40 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72  b->pWalArg = pAr
11d50 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
11d60 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11d70 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
11d80 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  et;.#else.  retu
11d90 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
11da0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
11db0 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a   database zDb..*
11dc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
11dd0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
11de0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
11e10 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
11e20 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
11e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
11e40 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20 64  me of attached d
11e50 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c  atabase (or NULL
11e60 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65  ) */.  int eMode
11e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11e80 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
11e90 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61  _CHECKPOINT_* va
11ea0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  lue */.  int *pn
11eb0 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Log,            
11ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
11ed0 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67   Size of WAL log
11ee0 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20   in frames */.  
11ef0 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20  int *pnCkpt     
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75  /* OUT: Total nu
11f20 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63  mber of frames c
11f30 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29  heckpointed */.)
11f40 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
11f50 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72  OMIT_WAL.  retur
11f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
11f70 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  se.  int rc;    
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
11fa0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ode */.  int iDb
11fb0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54   = SQLITE_MAX_AT
11fc0 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69  TACHED;  /* sqli
11fd0 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20  te3.aDb[] index 
11fe0 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f  of db to checkpo
11ff0 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
12000 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
12010 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
12020 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
12030 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
12040 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
12050 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  PT;.#endif..  /*
12060 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
12070 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
12080 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
12090 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
120a0 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
120b0 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
120c0 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
120d0 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
120e0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
120f0 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d  CKPOINT_PASSIVE=
12100 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12110 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
12120 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61  T_FULL==1 );.  a
12130 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
12140 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
12150 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
12160 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
12170 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29  NT_TRUNCATE==3 )
12180 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51  ;.  if( eMode<SQ
12190 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
121a0 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65  PASSIVE || eMode
121b0 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  >SQLITE_CHECKPOI
121c0 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20  NT_TRUNCATE ){. 
121d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
121e0 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38  F: R-03996-12088
121f0 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72   The M parameter
12200 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69 64   must be a valid
12210 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20   checkpoint.    
12220 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20  ** mode: */.    
12230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
12240 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  SUSE;.  }..  sql
12250 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12260 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
12270 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d  f( zDb && zDb[0]
12280 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   ){.    iDb = sq
12290 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
122a0 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20  db, zDb);.  }.  
122b0 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
122c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
122d0 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
122e0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
122f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75  SQLITE_ERROR, "u
12300 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a  nknown database:
12310 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65   %s", zDb);.  }e
12320 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73  lse{.    db->bus
12330 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d  yHandler.nBusy =
12340 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
12350 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64  ite3Checkpoint(d
12360 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70  b, iDb, eMode, p
12370 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
12380 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
12390 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  db, rc);.  }.  r
123a0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
123b0 69 74 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f  it(db, rc);..  /
123c0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
123d0 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
123e0 6e 74 73 2c 20 63 6c 65 61 72 20 74 68 65 20 69  nts, clear the i
123f0 6e 74 65 72 72 75 70 74 20 66 6c 61 67 20 61 74  nterrupt flag at
12400 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
12410 2e 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
12420 6e 56 64 62 65 41 63 74 69 76 65 3d 3d 30 20 29  nVdbeActive==0 )
12430 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e 69 73 49  {.    db->u1.isI
12440 6e 74 65 72 72 75 70 74 65 64 20 3d 20 30 3b 0a  nterrupted = 0;.
12450 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d    }..  sqlite3_m
12460 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
12470 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
12480 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
12490 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
124a0 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
124b0 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
124c0 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
124d0 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
124e0 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
124f0 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
12500 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
12510 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
12520 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
12530 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
12540 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
12550 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
12560 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56  r *zDb){.  /* EV
12570 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36  IDENCE-OF: R-416
12580 31 33 2d 32 30 35 35 33 20 54 68 65 20 73 71 6c  13-20553 The sql
12590 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
125a0 69 6e 74 28 44 2c 58 29 20 69 73 20 65 71 75 69  int(D,X) is equi
125b0 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73  valent to.  ** s
125c0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
125d0 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c  point_v2(D,X,SQL
125e0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
125f0 41 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a  ASSIVE,0,0). */.
12600 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12610 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
12620 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45  v2(db,zDb,SQLITE
12630 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
12640 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66  IVE,0,0);.}..#if
12650 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12660 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  _WAL./*.** Run a
12670 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64   checkpoint on d
12680 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69  atabase iDb. Thi
12690 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
126a0 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a  database iDb is.
126b0 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ** not currently
126c0 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64   open in WAL mod
126d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  e..**.** If a tr
126e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
126f0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
12700 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
12710 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66  nted, this .** f
12720 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
12730 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e  SQLITE_LOCKED an
12740 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  d a checkpoint i
12750 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e  s not attempted.
12760 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
12770 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75   occurs while ru
12780 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70  nning the checkp
12790 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20  oint, an SQLite 
127a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
127b0 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e  * returned (i.e.
127c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20   SQLITE_IOERR). 
127d0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
127e0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
127f0 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73  mutex on databas
12800 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75  e handle db shou
12810 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68  ld be held by th
12820 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75  e caller. The mu
12830 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  tex.** associate
12840 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
12850 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67  fic b-tree being
12860 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73   checkpointed is
12870 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69   taken by.** thi
12880 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  s function while
12890 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
128a0 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a  is running..**.*
128b0 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73  * If iDb is pass
128c0 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ed SQLITE_MAX_AT
128d0 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c  TACHED, then all
128e0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
128f0 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b  ses are.** check
12900 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65  pointed. If an e
12910 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
12920 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e  red it is return
12930 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d  ed immediately -
12940 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69  .** no attempt i
12950 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70  s made to checkp
12960 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69  oint any remaini
12970 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ng databases..**
12980 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d  .** Parameter eM
12990 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51  ode is one of SQ
129a0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
129b0 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 2c 20 52  PASSIVE, FULL, R
129c0 45 53 54 41 52 54 0a 2a 2a 20 6f 72 20 54 52 55  ESTART.** or TRU
129d0 4e 43 41 54 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  NCATE..*/.int sq
129e0 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
129f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
12a00 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
12a10 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
12a20 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
12a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12a50 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
12a60 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
12a90 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
12aa0 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
12ab0 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12ad0 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
12ae0 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
12af0 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
12b00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12b10 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
12b20 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
12b30 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
12b40 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
12b50 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
12b60 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
12b70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
12b80 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
12b90 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
12ba0 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
12bb0 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
12bc0 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
12bd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
12be0 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
12bf0 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
12c00 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
12c10 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
12c20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
12c30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
12c40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
12c50 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
12c60 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
12c70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12c90 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
12ca0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
12cb0 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
12cc0 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
12cd0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12ce0 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
12cf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
12d00 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
12d10 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
12d20 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
12d30 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
12d40 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
12d50 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
12d60 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
12d70 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
12d80 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
12d90 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
12da0 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
12db0 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
12dc0 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
12dd0 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
12de0 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
12df0 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
12e00 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
12e10 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
12e20 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
12e30 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
12e40 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
12e50 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
12e60 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
12e70 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
12e80 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
12e90 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
12ea0 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
12eb0 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
12ec0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
12ed0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
12ee0 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
12ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f00 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
12f30 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
12f40 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
12f50 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
12f60 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
12f70 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
12f80 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
12f90 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
12fa0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
12fc0 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
12fd0 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
13010 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
13040 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
13050 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13070 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
13080 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
13090 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
130a0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
130b0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
130c0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
130d0 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
130e0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
130f0 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
13100 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
13110 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
13120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
13130 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
13140 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
13150 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
13160 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
13170 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
13180 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
13190 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
131a0 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
131b0 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
131c0 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
131d0 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
131e0 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45  STORE==3.  UNUSE
131f0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
13200 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
13210 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
13220 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53  EMP_STORE<1 || S
13230 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13240 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  >3.  UNUSED_PARA
13250 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74  METER(db);.  ret
13260 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
13270 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
13280 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
13290 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
132a0 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
132b0 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
132c0 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
132d0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
132e0 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
132f0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
13300 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
13310 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
13320 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
13330 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d  NOMEM_BKPT);.  }
13340 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
13350 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
13360 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
13370 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
13380 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  tr(SQLITE_MISUSE
13390 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71  _BKPT);.  }.  sq
133a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
133b0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
133c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
133d0 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
133e0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
133f0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
13400 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
13410 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72  estcase( db->pEr
13420 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20  r==0 );.    z = 
13430 64 62 2d 3e 65 72 72 43 6f 64 65 20 3f 20 28 63  db->errCode ? (c
13440 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
13450 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72  ue_text(db->pErr
13460 29 20 3a 20 30 3b 0a 20 20 20 20 61 73 73 65 72  ) : 0;.    asser
13470 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
13480 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
13490 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z==0 ){.      z 
134a0 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
134b0 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20  db->errCode);.  
134c0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
134d0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
134e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
134f0 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
13500 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
13510 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  16./*.** Return 
13520 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45  UTF-16 encoded E
13530 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
13540 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
13550 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
13560 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
13570 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  t void *sqlite3_
13580 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33  errmsg16(sqlite3
13590 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
135a0 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d  const u16 outOfM
135b0 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27  em[] = {.    'o'
135c0 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
135d0 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
135e0 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27  'm', 'e', 'm', '
135f0 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a  o', 'r', 'y', 0.
13600 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
13610 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d  nst u16 misuse[]
13620 20 3d 20 7b 0a 20 20 20 20 27 62 27 2c 20 27 61   = {.    'b', 'a
13630 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 27 70 27  ', 'd', ' ', 'p'
13640 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'a', 'r', 'a',
13650 20 27 6d 27 2c 20 27 65 27 2c 20 27 74 27 2c 20   'm', 'e', 't', 
13660 27 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 0a 20  'e', 'r', ' ',. 
13670 20 20 20 27 6f 27 2c 20 27 72 27 2c 20 27 20 27     'o', 'r', ' '
13680 2c 20 27 6f 27 2c 20 27 74 27 2c 20 27 68 27 2c  , 'o', 't', 'h',
13690 20 27 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 20   'e', 'r', ' ', 
136a0 27 41 27 2c 20 27 50 27 2c 20 27 49 27 2c 20 27  'A', 'P', 'I', '
136b0 20 27 2c 0a 20 20 20 20 27 6d 27 2c 20 27 69 27   ',.    'm', 'i'
136c0 2c 20 27 73 27 2c 20 27 75 27 2c 20 27 73 27 2c  , 's', 'u', 's',
136d0 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20   'e', 0.  };..  
136e0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20  const void *z;. 
136f0 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
13700 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f  return (void *)o
13710 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69  utOfMem;.  }.  i
13720 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
13730 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
13740 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
13750 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b   (void *)misuse;
13760 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
13770 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
13780 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
13790 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
137a0 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a  .    z = (void *
137b0 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c  )outOfMem;.  }el
137c0 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  se{.    z = sqli
137d0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
137e0 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
137f0 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
13800 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
13810 74 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72  thMsg(db, db->er
13820 72 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72  rCode, sqlite3Er
13830 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
13840 29 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  ));.      z = sq
13850 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
13860 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
13870 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c    }.    /* A mal
13880 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66  loc() may have f
13890 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65  ailed within the
138a0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
138b0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a  _value_text16().
138c0 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66      ** above. If
138d0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
138e0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e  e, then the db->
138f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
13900 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  g needs to.    *
13910 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  * be cleared bef
13920 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44  ore returning. D
13930 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c  o this directly,
13940 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a   instead of via.
13950 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70      ** sqlite3Ap
13960 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69  iExit(), to avoi
13970 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61  d setting the da
13980 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72  tabase handle er
13990 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20  ror message..   
139a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
139b0 6f 6d 43 6c 65 61 72 28 64 62 29 3b 0a 20 20 7d  omClear(db);.  }
139c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
139d0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
139e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
139f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13a00 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
13a10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13a20 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
13a30 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ror code generat
13a40 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20  ed by an SQLite 
13a50 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c  routine. If NULL
13a60 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f   is.** passed to
13a70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
13a80 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c  we assume a mall
13a90 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69  oc() failed duri
13aa0 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ng sqlite3_open(
13ab0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
13ac0 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  3_errcode(sqlite
13ad0 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
13ae0 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
13af0 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
13b00 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
13b10 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
13b20 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
13b30 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
13b40 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
13b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13b60 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
13b70 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
13b80 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
13b90 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
13ba0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
13bb0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
13bc0 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
13bd0 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
13be0 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
13bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
13c00 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
13c10 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
13c20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13c30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13c40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
13c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
13c60 65 72 72 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73  errCode;.}.int s
13c70 71 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72  qlite3_system_er
13c80 72 6e 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29  rno(sqlite3 *db)
13c90 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 20 3f 20  {.  return db ? 
13ca0 64 62 2d 3e 69 53 79 73 45 72 72 6e 6f 20 3a 20  db->iSysErrno : 
13cb0 30 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65  0;.}  ../*.** Re
13cc0 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
13cd0 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
13ce0 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
13cf0 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
13d00 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f  ** argument.  Fo
13d10 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70  r now, this simp
13d20 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74  ly calls the int
13d30 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72  ernal sqlite3Err
13d40 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  Str().** functio
13d50 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
13d60 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72   *sqlite3_errstr
13d70 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75  (int rc){.  retu
13d80 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
13d90 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  (rc);.}../*.** C
13da0 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c  reate a new coll
13db0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66  ating function f
13dc0 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22  or database "db"
13dd0 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a  .  The name is z
13de0 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Name.** and the 
13df0 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e  encoding is enc.
13e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
13e10 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a  reateCollation(.
13e20 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20    sqlite3* db,. 
13e30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13e40 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20  me, .  u8 enc,. 
13e50 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
13e60 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
13e70 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
13e80 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
13e90 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
13ea0 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
13eb0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
13ec0 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20    int enc2;.  . 
13ed0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13ee0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
13ef0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
13f00 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
13f10 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
13f20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
13f30 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
13f40 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
13f50 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
13f60 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
13f70 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
13f80 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
13f90 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
13fa0 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
13fb0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
13fc0 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
13fd0 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  c;.  testcase( e
13fe0 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
13ff0 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
14000 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
14010 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20  F16_ALIGNED );. 
14020 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54   if( enc2==SQLIT
14030 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d  E_UTF16 || enc2=
14040 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
14050 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63  IGNED ){.    enc
14060 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
14070 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
14080 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54  ( enc2<SQLITE_UT
14090 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54  F8 || enc2>SQLIT
140a0 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
140b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
140c0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
140d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
140e0 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f  his call is remo
140f0 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e  ving or replacin
14100 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f  g an existing co
14110 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65  llation .  ** se
14120 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61  quence. If so, a
14130 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
14140 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20  ive VMs, return 
14150 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20  busy. If there. 
14160 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76   ** are no activ
14170 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74  e VMs, invalidat
14180 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c  e any pre-compil
14190 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
141a0 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   */.  pColl = sq
141b0 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
141c0 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
141d0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
141e0 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
141f0 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20  xCmp ){.    if( 
14200 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
14210 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14220 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
14230 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
14240 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
14250 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
14260 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
14270 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  ce due to active
14280 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
14290 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
142a0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
142b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
142c0 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
142d0 74 73 28 64 62 2c 20 30 29 3b 0a 0a 20 20 20 20  ts(db, 0);..    
142e0 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* If collation 
142f0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77  sequence pColl w
14300 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63  as created direc
14310 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  tly by a call to
14320 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
14330 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
14340 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61  , and not genera
14350 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ted by synthColl
14360 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68  Seq(),.    ** th
14370 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61  en any copies ma
14380 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  de by synthCollS
14390 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20  eq() need to be 
143a0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20  invalidated..   
143b0 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74   ** Also, collat
143c0 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d  ion destructor -
143d0 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20   CollSeq.xDel() 
143e0 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e  - function may n
143f0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
14400 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20   called..    */ 
14410 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d  .    if( (pColl-
14420 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55  >enc & ~SQLITE_U
14430 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65  TF16_ALIGNED)==e
14440 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  nc2 ){.      Col
14450 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71  lSeq *aColl = sq
14460 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
14470 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61  b->aCollSeq, zNa
14480 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  me);.      int j
14490 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
144a0 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
144b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
144c0 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   &aColl[j];.    
144d0 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d      if( p->enc==
144e0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
144f0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78          if( p->x
14500 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Del ){.         
14510 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55     p->xDel(p->pU
14520 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ser);.          
14530 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78  }.          p->x
14540 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cmp = 0;.       
14550 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14560 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  }..  pColl = 
14570 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
14580 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
14590 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66   zName, 1);.  if
145a0 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74  ( pColl==0 ) ret
145b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
145c0 5f 42 4b 50 54 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  _BKPT;.  pColl->
145d0 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
145e0 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
145f0 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d  = pCtx;.  pColl-
14600 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
14610 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38  pColl->enc = (u8
14620 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  )(enc2 | (enc & 
14630 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
14640 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65  GNED));.  sqlite
14650 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
14660 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20  E_OK);.  return 
14670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
14680 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20  *.** This array 
14690 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70  defines hard upp
146a0 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d  er bounds on lim
146b0 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a  it values.  The.
146c0 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d  ** initializer m
146d0 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73  ust be kept in s
146e0 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c  ync with the SQL
146f0 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23  ITE_LIMIT_*.** #
14700 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74  defines in sqlit
14710 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e3.h..*/.static 
14720 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c  const int aHardL
14730 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c  imit[] = {.  SQL
14740 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a  ITE_MAX_LENGTH,.
14750 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c    SQLITE_MAX_SQL
14760 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
14770 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20  E_MAX_COLUMN,.  
14780 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
14790 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
147a0 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
147b0 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ECT,.  SQLITE_MA
147c0 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c  X_VDBE_OP,.  SQL
147d0 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
147e0 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  _ARG,.  SQLITE_M
147f0 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53  AX_ATTACHED,.  S
14800 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
14810 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20  ATTERN_LENGTH,. 
14820 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
14830 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20  ABLE_NUMBER,    
14840 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39    /* IMP: R-3809
14850 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c  1-32352 */.  SQL
14860 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
14870 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
14880 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
14890 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  DS,.};../*.** Ma
148a0 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64  ke sure the hard
148b0 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20   limits are set 
148c0 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61  to reasonable va
148d0 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lues.*/.#if SQLI
148e0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30  TE_MAX_LENGTH<10
148f0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
14900 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _MAX_LENGTH must
14910 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
14920 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
14930 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
14940 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
14950 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
14960 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
14970 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
14980 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
14990 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45  QL_LENGTH>SQLITE
149a0 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72  _MAX_LENGTH.# er
149b0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
149c0 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e  QL_LENGTH must n
149d0 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ot be greater th
149e0 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  an SQLITE_MAX_LE
149f0 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20  NGTH.#endif.#if 
14a00 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
14a10 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65  UND_SELECT<2.# e
14a20 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
14a30 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
14a40 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
14a50 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   2.#endif.#if SQ
14a60 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
14a70 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  <40.# error SQLI
14a80 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d  TE_MAX_VDBE_OP m
14a90 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
14aa0 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  40.#endif.#if SQ
14ab0 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
14ac0 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54  N_ARG<0 || SQLIT
14ad0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
14ae0 52 47 3e 31 32 37 0a 23 20 65 72 72 6f 72 20 53  RG>127.# error S
14af0 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
14b00 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62  ON_ARG must be b
14b10 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 37  etween 0 and 127
14b20 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
14b30 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c  TE_MAX_ATTACHED<
14b40 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
14b50 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65  ATTACHED>125.# e
14b60 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
14b70 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65  ATTACHED must be
14b80 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
14b90 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  25.#endif.#if SQ
14ba0 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
14bb0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
14bc0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
14bd0 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
14be0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
14bf0 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
14c00 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
14c10 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72  OLUMN>32767.# er
14c20 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
14c30 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65  OLUMN must not e
14c40 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64  xceed 32767.#end
14c50 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
14c60 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c  X_TRIGGER_DEPTH<
14c70 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
14c80 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
14c90 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
14ca0 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
14cb0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
14cc0 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20  ER_THREADS<0 || 
14cd0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
14ce0 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65  R_THREADS>50.# e
14cf0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
14d00 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d  WORKER_THREADS m
14d10 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
14d20 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a   and 50.#endif..
14d30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
14d40 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
14d50 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
14d60 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
14d70 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
14d80 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
14d90 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
14da0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
14db0 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
14dc0 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
14dd0 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
14de0 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
14df0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
14e00 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
14e10 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
14e20 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
14e30 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
14e40 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
14e50 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
14e60 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
14e70 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
14e80 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
14e90 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
14ea0 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
14eb0 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
14ec0 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65  oldLimit;..#ifde
14ed0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14ee0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
14ef0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
14f00 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
14f10 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
14f20 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
14f30 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
14f40 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45  ndif..  /* EVIDE
14f50 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d  NCE-OF: R-30189-
14f60 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c  54097 For each l
14f70 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53 51  imit category SQ
14f80 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a  LITE_LIMIT_NAME.
14f90 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
14fa0 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
14fb0 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
14fc0 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65 70  time by a C prep
14fd0 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61  rocessor.  ** ma
14fe0 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54  cro called SQLIT
14ff0 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65  E_MAX_NAME. (The
15000 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68   "_LIMIT_" in th
15010 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65  e name is change
15020 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f  d to.  ** "_MAX_
15030 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ".).  */.  asser
15040 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
15050 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
15060 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  H]==SQLITE_MAX_L
15070 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
15080 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
15090 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
150a0 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
150b0 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b  AX_SQL_LENGTH );
150c0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
150d0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
150e0 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49  IT_COLUMN]==SQLI
150f0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b  TE_MAX_COLUMN );
15100 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15110 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15120 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d  IT_EXPR_DEPTH]==
15130 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
15140 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
15150 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
15160 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
15170 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c  UND_SELECT]==SQL
15180 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
15190 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65  _SELECT);.  asse
151a0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
151b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
151c0 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  _OP]==SQLITE_MAX
151d0 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73  _VDBE_OP );.  as
151e0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
151f0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  [SQLITE_LIMIT_FU
15200 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c  NCTION_ARG]==SQL
15210 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
15220 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74  _ARG );.  assert
15230 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15240 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
15250 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ED]==SQLITE_MAX_
15260 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73  ATTACHED );.  as
15270 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
15280 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  [SQLITE_LIMIT_LI
15290 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
152a0 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  H]==.           
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c      SQLITE_MAX_L
152e0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
152f0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
15300 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
15310 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
15320 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45  _NUMBER]==SQLITE
15330 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
15340 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28  MBER);.  assert(
15350 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15360 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
15370 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
15380 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
15390 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
153a0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
153b0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
153c0 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d  READS]==SQLITE_M
153d0 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
153e0 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  S );.  assert( S
153f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
15400 45 52 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c  ER_THREADS==(SQL
15410 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29  ITE_N_LIMIT-1) )
15420 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  ;...  if( limitI
15430 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
15440 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
15450 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
15460 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
15470 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
15480 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
15490 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20  Limit>=0 ){     
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
154b0 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38   IMP: R-52476-28
154c0 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  732 */.    if( n
154d0 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
154e0 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
154f0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
15500 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
15510 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  Id];  /* IMP: R-
15520 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20  51463-25634 */. 
15530 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
15540 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
15550 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
15560 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20  eturn oldLimit; 
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33      /* IMP: R-53
15590 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a  341-35419 */.}..
155a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
155b0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
155c0 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61  arse both URIs a
155d0 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  nd non-URI filen
155e0 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74  ames passed by t
155f0 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50  he.** user to AP
15600 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69  I functions sqli
15610 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  te3_open() or sq
15620 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c  lite3_open_v2(),
15630 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73   and for databas
15640 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66  e.** URIs specif
15650 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41  ied as part of A
15660 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73  TTACH statements
15670 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
15680 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
15690 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
156a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
156b0 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a  FS to use (or.**
156c0 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69   a NULL to signi
156d0 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  fy the default V
156e0 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64  FS) if the URI d
156f0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
15700 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71  a "vfs=xxx".** q
15710 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20  uery parameter. 
15720 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
15730 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ent contains the
15740 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49   URI (or non-URI
15750 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74   filename).** it
15760 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20  self. When this 
15770 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15780 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76  ed the *pFlags v
15790 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63  ariable should c
157a0 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65  ontain.** the de
157b0 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f  fault flags to o
157c0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
157d0 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68   handle with. Th
157e0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
157f0 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79  n.** *pFlags may
15800 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f   be updated befo
15810 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20  re returning if 
15820 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  the URI filename
15830 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63   contains .** "c
15840 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f  ache=xxx" or "mo
15850 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61  de=xxx" query pa
15860 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  rameters..**.** 
15870 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
15880 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15890 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
158a0 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74  se *ppVfs is set
158b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
158c0 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f  the VFS that sho
158d0 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f  uld be used to o
158e0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
158f0 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69   file. *pzFile i
15900 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
15910 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
15920 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
15930 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
15940 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65   open. It is the
15950 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
15960 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
15970 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
15980 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
15990 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a  e() to release.*
159a0 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a  * this buffer..*
159b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
159c0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e   occurs, then an
159d0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
159e0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
159f0 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20  nd *pzErrMsg.** 
15a00 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
15a10 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
15a20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e  containing an En
15a30 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
15a40 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
15a50 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
15a60 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
15a70 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
15a80 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a  tually release.*
15a90 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79  * this buffer by
15aa0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
15ab0 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _free()..*/.int 
15ac0 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
15ad0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15ae0 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20  DefaultVfs,     
15af0 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
15b00 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22   if no "vfs=xxx"
15b10 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f   query option */
15b20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15b30 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uri,            
15b40 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
15b50 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73  ated URI to pars
15b60 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
15b70 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
15b80 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
15b90 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  : SQLITE_OPEN_XX
15ba0 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
15bb0 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73  ite3_vfs **ppVfs
15bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
15bd0 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20  OUT: VFS to use 
15be0 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46  */ .  char **pzF
15bf0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
15c00 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69        /* OUT: Fi
15c10 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  lename component
15c20 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61   of URI */.  cha
15c30 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c50 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
15c60 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54  ge (if rc!=SQLIT
15c70 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  E_OK) */.){.  in
15c80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15c90 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
15ca0 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73   flags = *pFlags
15cb0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
15cc0 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56  zVfs = zDefaultV
15cd0 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  fs;.  char *zFil
15ce0 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69  e;.  char c;.  i
15cf0 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65  nt nUri = sqlite
15d00 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b  3Strlen30(zUri);
15d10 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ..  assert( *pzE
15d20 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69  rrMsg==0 );..  i
15d30 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  f( ((flags & SQL
15d40 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20  ITE_OPEN_URI)   
15d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
15d60 3a 20 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20  : R-48725-32206 
15d70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  */.            |
15d80 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
15d90 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20  onfig.bOpenUri) 
15da0 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d  /* IMP: R-51689-
15db0 34 36 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e  46548 */.   && n
15dc0 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
15dd0 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
15de0 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  5)==0 /* IMP: R-
15df0 35 37 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20  57884-37496 */. 
15e00 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
15e10 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61  pt;.    int eSta
15e20 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
15e30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
15e40 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69  state when parsi
15e50 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e  ng URI */.    in
15e60 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t iIn;          
15e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15e80 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  nput character i
15e90 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
15ea0 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  iOut = 0;       
15eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
15ec0 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
15ed0 64 65 78 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e  dex */.    u64 n
15ee0 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20  Byte = nUri+2;  
15ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
15f00 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
15f10 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f  locate */..    /
15f20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
15f30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
15f40 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69  flag is set to i
15f50 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56  ndicate to the V
15f60 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a  FS xOpen .    **
15f70 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65   method that the
15f80 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20  re may be extra 
15f90 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f  parameters follo
15fa0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61  wing the file-na
15fb0 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  me.  */.    flag
15fc0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
15fd0 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69  _URI;..    for(i
15fe0 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20  In=0; iIn<nUri; 
15ff0 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20  iIn++) nByte += 
16000 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29  (zUri[iIn]=='&')
16010 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  ;.    zFile = sq
16020 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
16030 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Byte);.    if( !
16040 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
16050 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
16060 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a  ;..    iIn = 5;.
16070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c  #ifdef SQLITE_AL
16080 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54  LOW_URI_AUTHORIT
16090 59 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  Y.    if( strncm
160a0 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c  p(zUri+5, "///",
160b0 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
160c0 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 2f  iIn = 7;.      /
160d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
160e0 63 6f 6e 64 69 74 69 6f 6e 20 63 61 75 73 65 73  condition causes
160f0 20 55 52 49 73 20 77 69 74 68 20 66 69 76 65 20   URIs with five 
16100 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63  leading / charac
16110 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 6c 69  ters.      ** li
16120 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73  ke file://///hos
16130 74 2f 70 61 74 68 20 74 6f 20 62 65 20 63 6f 6e  t/path to be con
16140 76 65 72 74 65 64 20 69 6e 74 6f 20 55 4e 43 73  verted into UNCs
16150 20 6c 69 6b 65 20 2f 2f 68 6f 73 74 2f 70 61 74   like //host/pat
16160 68 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  h..      ** The 
16170 63 6f 72 72 65 63 74 20 55 52 49 20 66 6f 72 20  correct URI for 
16180 74 68 61 74 20 55 4e 43 20 68 61 73 20 6f 6e 6c  that UNC has onl
16190 79 20 74 77 6f 20 6f 72 20 66 6f 75 72 20 6c 65  y two or four le
161a0 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65  ading / characte
161b0 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  rs.      ** file
161c0 3a 2f 2f 68 6f 73 74 2f 70 61 74 68 20 6f 72 20  ://host/path or 
161d0 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61  file:////host/pa
161e0 74 68 2e 20 20 42 75 74 20 35 20 6c 65 61 64 69  th.  But 5 leadi
161f0 6e 67 20 73 6c 61 73 68 65 73 20 69 73 20 61 20  ng slashes is a 
16200 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e  .      ** common
16210 20 65 72 72 6f 72 2c 20 77 65 20 61 72 65 20 74   error, we are t
16220 6f 6c 64 2c 20 73 6f 20 77 65 20 68 61 6e 64 6c  old, so we handl
16230 65 20 69 74 20 61 73 20 61 20 73 70 65 63 69 61  e it as a specia
16240 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20  l case. */.     
16250 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
16260 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d  i+7, "///", 3)==
16270 30 20 29 7b 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20  0 ){ iIn++; }.  
16280 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
16290 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c  cmp(zUri+5, "//l
162a0 6f 63 61 6c 68 6f 73 74 2f 22 2c 20 31 32 29 3d  ocalhost/", 12)=
162b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  =0 ){.      iIn 
162c0 3d 20 31 36 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  = 16;.    }.#els
162d0 65 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  e.    /* Discard
162e0 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20   the scheme and 
162f0 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e  authority segmen
16300 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a  ts of the URI. *
16310 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35  /.    if( zUri[5
16320 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36  ]=='/' && zUri[6
16330 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
16340 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77  iIn = 7;.      w
16350 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20  hile( zUri[iIn] 
16360 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f  && zUri[iIn]!='/
16370 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20  ' ) iIn++;.     
16380 20 69 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28   if( iIn!=7 && (
16390 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d  iIn!=16 || memcm
163a0 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26  p("localhost", &
163b0 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a  zUri[7], 9)) ){.
163c0 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
163d0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
163e0 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69  ntf("invalid uri
163f0 20 61 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73   authority: %.*s
16400 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
16410 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29  iIn-7, &zUri[7])
16420 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
16430 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
16440 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
16450 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  uri_out;.      }
16460 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
16470 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66     /* Copy the f
16480 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20  ilename and any 
16490 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
164a0 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20   into the zFile 
164b0 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20  buffer. .    ** 
164c0 44 65 63 6f 64 65 20 25 48 48 20 65 73 63 61 70  Decode %HH escap
164d0 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68  e codes along th
164e0 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20  e way. .    **. 
164f0 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69     ** Within thi
16500 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65  s loop, variable
16510 20 65 53 74 61 74 65 20 6d 61 79 20 62 65 20 73   eState may be s
16520 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c  et to 0, 1 or 2,
16530 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a   depending.    *
16540 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67  * on the parsing
16550 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c   context. As fol
16560 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  lows:.    **.   
16570 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67   **   0: Parsing
16580 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20   file-name..    
16590 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20  **   1: Parsing 
165a0 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  name section of 
165b0 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65  a name=value que
165c0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20  ry parameter..  
165d0 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e    **   2: Parsin
165e0 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20  g value section 
165f0 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20  of a name=value 
16600 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
16610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61  .    */.    eSta
16620 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  te = 0;.    whil
16630 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e  e( (c = zUri[iIn
16640 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20  ])!=0 && c!='#' 
16650 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a  ){.      iIn++;.
16660 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27        if( c=='%'
16670 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
16680 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
16690 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26  [iIn]) .       &
166a0 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69  & sqlite3Isxdigi
166b0 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a  t(zUri[iIn+1]) .
166c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
166d0 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71   int octet = (sq
166e0 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55  lite3HexToInt(zU
166f0 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29  ri[iIn++]) << 4)
16700 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65 74 20  ;.        octet 
16710 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49  += sqlite3HexToI
16720 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b  nt(zUri[iIn++]);
16730 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
16740 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63  ( octet>=0 && oc
16750 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20  tet<256 );.     
16760 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20     if( octet==0 
16770 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
16780 45 5f 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f  E_ENABLE_URI_00_
16790 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20  ERROR.          
167a0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
167b0 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30  s taken when "%0
167c0 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69  0" appears withi
167d0 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68  n the URI. In th
167e0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
167f0 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61  case we ignore a
16800 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72  ll text in the r
16810 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
16820 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20  path, name or.  
16830 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
16840 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
16850 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f   parsed. So igno
16860 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
16870 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20  haracter.       
16880 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74     ** and skip t
16890 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20  o the next "?", 
168a0 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61  "=" or "&", as a
168b0 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20  ppropriate. */. 
168c0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
168d0 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
168e0 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20  =0 && c!='#' .  
168f0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
16900 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d  eState!=0 || c!=
16910 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20  '?').           
16920 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31     && (eState!=1
16930 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63   || (c!='=' && c
16940 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20  !='&')).        
16950 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
16960 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20  !=2 || c!='&'). 
16970 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
16980 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20          iIn++;. 
16990 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
169a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23       continue;.#
169b0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f  else.          /
169c0 2a 20 49 66 20 45 4e 41 42 4c 45 5f 55 52 49 5f  * If ENABLE_URI_
169d0 30 30 5f 45 52 52 4f 52 20 69 73 20 64 65 66 69  00_ERROR is defi
169e0 6e 65 64 2c 20 22 25 30 30 22 20 69 6e 20 61 20  ned, "%00" in a 
169f0 55 52 49 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  URI is an error.
16a00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2a 70   */.          *p
16a10 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
16a20 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 65 78 70  3_mprintf("unexp
16a30 65 63 74 65 64 20 25 25 30 30 20 69 6e 20 75 72  ected %%00 in ur
16a40 69 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i");.          r
16a50 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16a60 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
16a70 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
16a80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
16a90 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74  .        c = oct
16aa0 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  et;.      }else 
16ab0 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26  if( eState==1 &&
16ac0 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27   (c=='&' || c=='
16ad0 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =') ){.        i
16ae0 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d  f( zFile[iOut-1]
16af0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16b00 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74   /* An empty opt
16b10 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65  ion name. Ignore
16b20 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74   this option alt
16b30 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  ogether. */.    
16b40 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
16b50 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
16b60 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69  In]!='#' && zUri
16b70 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69  [iIn-1]!='&' ) i
16b80 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
16b90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16ba0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16bb0 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20  c=='&' ){.      
16bc0 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
16bd0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
16be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16bf0 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20     eState = 2;. 
16c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16c10 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   c = 0;.      }e
16c20 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d  lse if( (eState=
16c30 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c  =0 && c=='?') ||
16c40 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63   (eState==2 && c
16c50 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20  =='&') ){.      
16c60 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
16c70 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20   eState = 1;.   
16c80 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65     }.      zFile
16c90 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [iOut++] = c;.  
16ca0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61    }.    if( eSta
16cb0 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f  te==1 ) zFile[iO
16cc0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
16cd0 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
16ce0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
16cf0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
16d00 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
16d10 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e  if there were an
16d20 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66  y options specif
16d30 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ied that should 
16d40 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a  be interpreted .
16d50 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74      ** here. Opt
16d60 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e  ions that are in
16d70 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69  terpreted here i
16d80 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64  nclude "vfs" and
16d90 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20   those that.    
16da0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ** correspond to
16db0 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20   flags that may 
16dc0 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  be passed to the
16dd0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
16de0 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ().    ** method
16df0 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20  . */.    zOpt = 
16e00 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74  &zFile[sqlite3St
16e10 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d  rlen30(zFile)+1]
16e20 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70  ;.    while( zOp
16e30 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  t[0] ){.      in
16e40 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  t nOpt = sqlite3
16e50 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a  Strlen30(zOpt);.
16e60 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c        char *zVal
16e70 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d   = &zOpt[nOpt+1]
16e80 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  ;.      int nVal
16e90 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
16ea0 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20  30(zVal);..     
16eb0 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20   if( nOpt==3 && 
16ec0 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f  memcmp("vfs", zO
16ed0 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 3)==0 ){.   
16ee0 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c       zVfs = zVal
16ef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16f00 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70         struct Op
16f10 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20  enMode {.       
16f20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16f30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
16f40 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20  mode;.        } 
16f50 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  *aMode = 0;.    
16f60 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54      char *zModeT
16f70 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ype = 0;.       
16f80 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20   int mask = 0;. 
16f90 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74         int limit
16fa0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69   = 0;..        i
16fb0 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65  f( nOpt==5 && me
16fc0 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f  mcmp("cache", zO
16fd0 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 5)==0 ){.   
16fe0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
16ff0 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43  ruct OpenMode aC
17000 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  acheMode[] = {. 
17010 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68             { "sh
17020 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f  ared",  SQLITE_O
17030 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
17040 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
17050 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49   "private", SQLI
17060 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
17070 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  ACHE },.        
17080 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
17090 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
170a0 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
170b0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
170c0 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  CHE|SQLITE_OPEN_
170d0 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20  PRIVATECACHE;.  
170e0 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
170f0 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20  aCacheMode;.    
17100 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
17110 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  sk;.          zM
17120 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65  odeType = "cache
17130 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
17140 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34       if( nOpt==4
17150 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65   && memcmp("mode
17160 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29  ", zOpt, 4)==0 )
17170 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
17180 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f  ic struct OpenMo
17190 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d  de aOpenMode[] =
171a0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
171b0 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "ro",  SQLITE_O
171c0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a  PEN_READONLY },.
171d0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
171e0 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  w",  SQLITE_OPEN
171f0 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20  _READWRITE }, . 
17200 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
17210 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  c", SQLITE_OPEN_
17220 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
17230 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
17240 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
17250 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45  "memory", SQLITE
17260 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a  _OPEN_MEMORY },.
17270 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
17280 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
17290 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
172a0 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
172b0 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54  READONLY | SQLIT
172c0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
172d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
172e0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
172f0 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
17300 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20  E_OPEN_MEMORY;. 
17310 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
17320 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20   aOpenMode;.    
17330 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
17340 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20  sk & flags;.    
17350 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
17360 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20  = "access";.    
17370 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
17380 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20  f( aMode ){.    
17390 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
173a0 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20         int mode 
173b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
173c0 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d  or(i=0; aMode[i]
173d0 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .z; i++){.      
173e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
173f0 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a   *z = aMode[i].z
17400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
17410 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53  ( nVal==sqlite3S
17420 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d  trlen30(z) && 0=
17430 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c  =memcmp(zVal, z,
17440 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20   nVal) ){.      
17450 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61          mode = a
17460 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20  Mode[i].mode;.  
17470 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
17480 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
17490 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
174a0 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d         if( mode=
174b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
174c0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
174d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
174e0 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20  o such %s mode: 
174f0 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20  %s", zModeType, 
17500 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
17510 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
17520 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
17530 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
17540 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
17550 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
17560 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f  (mode & ~SQLITE_
17570 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d  OPEN_MEMORY)>lim
17580 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
17590 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
175a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
175b0 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77  s mode not allow
175c0 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ed: %s",.       
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
17600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
17610 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  c = SQLITE_PERM;
17620 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
17630 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
17640 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17650 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28         flags = (
17660 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c  flags & ~mask) |
17670 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
17680 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17690 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61  zOpt = &zVal[nVa
176a0 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  l+1];.    }..  }
176b0 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20  else{.    zFile 
176c0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
176d0 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20  64(nUri+2);.    
176e0 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
176f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
17700 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
17710 55 72 69 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  Uri ){.      mem
17720 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c  cpy(zFile, zUri,
17730 20 6e 55 72 69 29 3b 0a 20 20 20 20 7d 0a 20 20   nUri);.    }.  
17740 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20    zFile[nUri] = 
17750 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
17760 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nUri+1] = '\0';.
17770 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
17780 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
17790 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73   }..  *ppVfs = s
177a0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
177b0 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70  zVfs);.  if( *pp
177c0 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Vfs==0 ){.    *p
177d0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
177e0 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
177f0 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66  ch vfs: %s", zVf
17800 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  s);.    rc = SQL
17810 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
17820 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20  parse_uri_out:. 
17830 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17840 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
17850 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  3_free(zFile);. 
17860 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20     zFile = 0;.  
17870 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c  }.  *pFlags = fl
17880 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d  ags;.  *pzFile =
17890 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e   zFile;.  return
178a0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
178b0 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
178c0 4f 44 45 43 29 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ODEC)./*.** Proc
178d0 65 73 73 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  ess URI filename
178e0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
178f0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68  s relevant to th
17900 65 20 53 51 4c 69 74 65 20 45 6e 63 72 79 70 74  e SQLite Encrypt
17910 69 6f 6e 0a 2a 2a 20 45 78 74 65 6e 73 69 6f 6e  ion.** Extension
17920 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
17930 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 6c  f any of the rel
17940 65 76 61 6e 74 20 71 75 65 72 79 20 70 61 72 61  evant query para
17950 6d 65 74 65 72 73 20 61 72 65 0a 2a 2a 20 73 65  meters are.** se
17960 65 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 66 61  en and return fa
17970 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69  lse if not..*/.i
17980 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 63 51  nt sqlite3CodecQ
17990 75 65 72 79 50 61 72 61 6d 65 74 65 72 73 28 0a  ueryParameters(.
179a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
179b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
179c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
179d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
179e0 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 57  *zDb,       /* W
179f0 68 69 63 68 20 73 63 68 65 6d 61 20 69 73 20 62  hich schema is b
17a00 65 69 6e 67 20 63 72 65 61 74 65 64 2f 61 74 74  eing created/att
17a10 61 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ached */.  const
17a20 20 63 68 61 72 20 2a 7a 55 72 69 20 20 20 20 20   char *zUri     
17a30 20 20 2f 2a 20 55 52 49 20 66 69 6c 65 6e 61 6d    /* URI filenam
17a40 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
17a50 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 66  char *zKey;.  if
17a60 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65  ( (zKey = sqlite
17a70 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
17a80 7a 55 72 69 2c 20 22 68 65 78 6b 65 79 22 29 29  zUri, "hexkey"))
17a90 21 3d 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20 29  !=0 && zKey[0] )
17aa0 7b 0a 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a  {.    u8 iByte;.
17ab0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
17ac0 68 61 72 20 7a 44 65 63 6f 64 65 64 5b 34 30 5d  har zDecoded[40]
17ad0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69  ;.    for(i=0, i
17ae0 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  Byte=0; i<sizeof
17af0 28 7a 44 65 63 6f 64 65 64 29 2a 32 20 26 26 20  (zDecoded)*2 && 
17b00 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
17b10 7a 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a  zKey[i]); i++){.
17b20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69        iByte = (i
17b30 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74  Byte<<4) + sqlit
17b40 65 33 48 65 78 54 6f 49 6e 74 28 7a 4b 65 79 5b  e3HexToInt(zKey[
17b50 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  i]);.      if( (
17b60 69 26 31 29 21 3d 30 20 29 20 7a 44 65 63 6f 64  i&1)!=0 ) zDecod
17b70 65 64 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ed[i/2] = iByte;
17b80 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
17b90 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  e3_key_v2(db, zD
17ba0 62 2c 20 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32  b, zDecoded, i/2
17bb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
17bc0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 4b  .  }else if( (zK
17bd0 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  ey = sqlite3_uri
17be0 5f 70 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c  _parameter(zUri,
17bf0 20 22 6b 65 79 22 29 29 21 3d 30 20 29 7b 0a 20   "key"))!=0 ){. 
17c00 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76     sqlite3_key_v
17c10 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c  2(db, zDb, zKey,
17c20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17c30 28 7a 4b 65 79 29 29 3b 0a 20 20 20 20 72 65 74  (zKey));.    ret
17c40 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  urn 1;.  }else i
17c50 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74  f( (zKey = sqlit
17c60 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
17c70 28 7a 55 72 69 2c 20 22 74 65 78 74 6b 65 79 22  (zUri, "textkey"
17c80 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
17c90 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20  ite3_key_v2(db, 
17ca0 7a 44 62 2c 20 7a 4b 65 79 2c 20 2d 31 29 3b 0a  zDb, zKey, -1);.
17cb0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
17cd0 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  n 0;.  }.}.#endi
17ce0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
17cf0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
17d00 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
17d10 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
17d20 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
17d30 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
17d40 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
17d50 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
17d60 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
17d70 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
17d80 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
17d90 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
17da0 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
17db0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
17dc0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
17dd0 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
17de0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
17df0 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
17e00 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
17e10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
17e20 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
17e30 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65  flags,    /* Ope
17e40 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
17e50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
17e60 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
17e70 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
17e80 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
17e90 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17eb0 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  Store allocated 
17ec0 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
17ed0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17f00 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  */.  int isThrea
17f10 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20  dsafe;          
17f20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
17f30 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e   threadsafe conn
17f40 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  ections */.  cha
17f50 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20  r *zOpen = 0;   
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17f70 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
17f80 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72  t to pass to Btr
17f90 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68  eeOpen() */.  ch
17fa0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17fc0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
17fd0 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65  rom sqlite3Parse
17fe0 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66  Uri() */..#ifdef
17ff0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
18000 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70  PI_ARMOR.  if( p
18010 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pDb==0 ) return 
18020 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
18030 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70  PT;.#endif.  *pp
18040 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
18050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18060 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
18070 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
18080 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
18090 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a  urn rc;.#endif..
180a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
180b0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
180c0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  utex==0 ){.    i
180d0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
180e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
180f0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
18100 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  _NOMUTEX ){.    
18110 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
18120 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
18130 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
18140 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20  N_FULLMUTEX ){. 
18150 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
18160 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
18170 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
18180 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18190 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b  nfig.bFullMutex;
181a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67  .  }..  if( flag
181b0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
181c0 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a  PRIVATECACHE ){.
181d0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
181e0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
181f0 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69  CACHE;.  }else i
18200 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
18210 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
18220 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
18230 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
18240 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
18250 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  E;.  }..  /* Rem
18260 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73  ove harmful bits
18270 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20   from the flags 
18280 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20  parameter.  **. 
18290 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f   ** The SQLITE_O
182a0 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20  PEN_NOMUTEX and 
182b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
182c0 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65  MUTEX flags were
182d0 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
182e0 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
182f0 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65   code block.  Be
18300 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65  sides these, the
18310 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64   only.  ** valid
18320 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72   input flags for
18330 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
18340 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50  () are SQLITE_OP
18350 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a  EN_READONLY,.  *
18360 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  * SQLITE_OPEN_RE
18370 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f  ADWRITE, SQLITE_
18380 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c  OPEN_CREATE, SQL
18390 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
183a0 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ACHE,.  ** SQLIT
183b0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
183c0 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65  CHE, and some re
183d0 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69  served bits.  Si
183e0 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a  lently mask.  **
183f0 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66   off all other f
18400 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  lags..  */.  fla
18410 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45  gs &=  ~( SQLITE
18420 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
18430 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
18440 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18450 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
18460 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18470 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
18480 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
18490 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
184a0 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  P_DB | .        
184b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
184c0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
184d0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
184e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
184f0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  IN_JOURNAL | .  
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18510 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
18520 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
18530 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18540 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
18550 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18560 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
18570 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20  TER_JOURNAL |.  
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18590 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
185a0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
185b0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55    SQLITE_OPEN_FU
185c0 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  LLMUTEX |.      
185d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
185e0 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20  OPEN_WAL.       
185f0 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41        );..  /* A
18600 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
18610 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
18620 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
18630 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
18640 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29  izeof(sqlite3) )
18650 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
18660 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
18670 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73  .  if( isThreads
18680 61 66 65 20 0a 23 69 66 64 65 66 20 53 51 4c 49  afe .#ifdef SQLI
18690 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 54  TE_ENABLE_MULTIT
186a0 48 52 45 41 44 45 44 5f 43 48 45 43 4b 53 0a 20  HREADED_CHECKS. 
186b0 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62    || sqlite3Glob
186c0 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
186d0 74 65 78 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  tex.#endif.  ){.
186e0 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
186f0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
18700 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
18710 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
18720 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
18730 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18740 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
18750 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
18760 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
18770 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
18780 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 29 7b  Threadsafe==0 ){
18790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75  .      sqlite3Mu
187a0 74 65 78 57 61 72 6e 4f 6e 43 6f 6e 74 65 6e 74  texWarnOnContent
187b0 69 6f 6e 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ion(db->mutex);.
187c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
187d0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
187e0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
187f0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
18800 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
18810 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
18820 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
18830 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
18840 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 73  ->aDbStatic;.  s
18850 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 44  qlite3LookasideD
18860 69 73 61 62 6c 65 28 26 64 62 2d 3e 6c 6f 6f 6b  isable(&db->look
18870 61 73 69 64 65 29 3b 0a 0a 20 20 61 73 73 65 72  aside);..  asser
18880 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t( sizeof(db->aL
18890 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48  imit)==sizeof(aH
188a0 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d  ardLimit) );.  m
188b0 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74  emcpy(db->aLimit
188c0 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69  , aHardLimit, si
188d0 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
188e0 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  );.  db->aLimit[
188f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
18900 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20 53  KER_THREADS] = S
18910 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f  QLITE_DEFAULT_WO
18920 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20  RKER_THREADS;.  
18930 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
18940 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
18950 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
18960 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74  ->szMmap = sqlit
18970 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
18980 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78  zMmap;.  db->nex
18990 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20  tPagesize = 0;. 
189a0 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d   db->nMaxSorterM
189b0 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46 46 46  map = 0x7FFFFFFF
189c0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
189d0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
189e0 4e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20  Names.          
189f0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
18a00 45 6e 61 62 6c 65 54 72 69 67 67 65 72 0a 20 20  EnableTrigger.  
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 56 69   SQLITE_EnableVi
18a30 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ew.             
18a40 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 61 63      | SQLITE_Cac
18a50 68 65 53 70 69 6c 6c 0a 0a 2f 2a 20 54 68 65 20  heSpill../* The 
18a60 53 51 4c 49 54 45 5f 44 51 53 20 63 6f 6d 70 69  SQLITE_DQS compi
18a70 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 64  le-time option d
18a80 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 64 65  etermines the de
18a90 66 61 75 6c 74 20 73 65 74 74 69 6e 67 73 0a 2a  fault settings.*
18aa0 2a 20 66 6f 72 20 53 51 4c 49 54 45 5f 44 42 43  * for SQLITE_DBC
18ab0 4f 4e 46 49 47 5f 44 51 53 5f 44 44 4c 20 61 6e  ONFIG_DQS_DDL an
18ac0 64 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  d SQLITE_DBCONFI
18ad0 47 5f 44 51 53 5f 44 4d 4c 2e 0a 2a 2a 0a 2a 2a  G_DQS_DML..**.**
18ae0 20 20 20 20 53 51 4c 49 54 45 5f 44 51 53 20 20      SQLITE_DQS  
18af0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
18b00 49 47 5f 44 51 53 5f 44 44 4c 20 20 20 20 53 51  IG_DQS_DDL    SQ
18b10 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51  LITE_DBCONFIG_DQ
18b20 53 5f 44 4d 4c 0a 2a 2a 20 20 20 20 2d 2d 2d 2d  S_DML.**    ----
18b30 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
18b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b50 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
18b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
18b70 20 20 20 20 20 75 6e 64 65 66 69 6e 65 64 20 20       undefined  
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20               on 
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ba0 20 20 20 20 20 20 20 20 20 6f 6e 20 20 20 0a 2a           on   .*
18bb0 2a 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20  *         3     
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 20 20 20 20 20 20 6f 6e 0a 2a 2a 20            on.** 
18bf0 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
18c00 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20 20              on  
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c20 20 20 20 20 20 20 20 6f 66 66 0a 2a 2a 20 20 20         off.**   
18c30 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
18c40 20 20 20 20 20 20 20 20 20 6f 66 66 20 20 20 20           off    
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c60 20 20 20 20 20 20 6f 6e 0a 2a 2a 20 20 20 20 20        on.**     
18c70 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
18c80 20 20 20 20 20 20 20 6f 66 66 20 20 20 20 20 20         off      
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ca0 20 20 20 6f 66 66 0a 2a 2a 0a 2a 2a 20 4c 65 67     off.**.** Leg
18cb0 61 63 79 20 62 65 68 61 76 69 6f 72 20 69 73 20  acy behavior is 
18cc0 33 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64  3 (double-quoted
18cd0 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   string literals
18ce0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 61 6e 79   are allowed any
18cf0 77 68 65 72 65 29 0a 2a 2a 20 61 6e 64 20 73 6f  where).** and so
18d00 20 74 68 61 74 20 69 73 20 74 68 65 20 64 65 66   that is the def
18d10 61 75 6c 74 2e 20 20 42 75 74 20 64 65 76 65 6c  ault.  But devel
18d20 6f 70 65 72 73 20 61 72 65 20 65 6e 63 6f 75 72  opers are encour
18d30 61 6e 67 65 64 20 74 6f 20 75 73 65 0a 2a 2a 20  anged to use.** 
18d40 2d 44 53 51 4c 49 54 45 5f 44 51 53 3d 30 20 28  -DSQLITE_DQS=0 (
18d50 62 65 73 74 29 20 6f 72 20 2d 44 53 51 4c 49 54  best) or -DSQLIT
18d60 45 5f 44 51 53 3d 31 20 28 73 65 63 6f 6e 64 20  E_DQS=1 (second 
18d70 63 68 6f 69 63 65 29 20 69 66 20 70 6f 73 73 69  choice) if possi
18d80 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ble..*/.#if !def
18d90 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 51 53 29  ined(SQLITE_DQS)
18da0 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
18db0 5f 44 51 53 20 33 0a 23 65 6e 64 69 66 0a 23 69  _DQS 3.#endif.#i
18dc0 66 20 28 53 51 4c 49 54 45 5f 44 51 53 26 31 29  f (SQLITE_DQS&1)
18dd0 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==1.            
18de0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 44 71       | SQLITE_Dq
18df0 73 44 4d 4c 0a 23 65 6e 64 69 66 0a 23 69 66 20  sDML.#endif.#if 
18e00 28 53 51 4c 49 54 45 5f 44 51 53 26 32 29 3d 3d  (SQLITE_DQS&2)==
18e10 32 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2.              
18e20 20 20 20 7c 20 53 51 4c 49 54 45 5f 44 71 73 44     | SQLITE_DqsD
18e30 44 4c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  DL.#endif..#if !
18e40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
18e50 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
18e60 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54  _INDEX) || SQLIT
18e70 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
18e80 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20  TIC_INDEX.      
18e90 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
18ea0 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65  ITE_AutoIndex.#e
18eb0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
18ec0 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c  DEFAULT_CKPTFULL
18ed0 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20  FSYNC.          
18ee0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
18ef0 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65  CkptFullFSync.#e
18f00 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
18f10 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
18f20 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
18f30 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
18f40 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
18f50 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
18f60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
18f70 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
18f80 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
18f90 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
18fa0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
18fb0 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
18fc0 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18fe0 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
18ff0 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
19000 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
19010 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
19020 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
19030 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
19040 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
19050 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
19060 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
19070 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19080 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44  TE_REVERSE_UNORD
19090 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20  ERED_SELECTS).  
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
190b0 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
190c0 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20  rder.#endif.#if 
190d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
190e0 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
190f0 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20  ELL_CHECK).     
19100 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19110 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a  LITE_CellSizeCk.
19120 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
19130 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
19140 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 29  _FTS3_TOKENIZER)
19150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19160 20 20 7c 20 53 51 4c 49 54 45 5f 46 74 73 33 54    | SQLITE_Fts3T
19170 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64 69 66 0a  okenizer.#endif.
19180 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19190 54 45 5f 45 4e 41 42 4c 45 5f 51 50 53 47 29 0a  TE_ENABLE_QPSG).
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   | SQLITE_Enable
191c0 51 50 53 47 0a 23 65 6e 64 69 66 0a 23 69 66 20  QPSG.#endif.#if 
191d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
191e0 45 46 41 55 4c 54 5f 44 45 46 45 4e 53 49 56 45  EFAULT_DEFENSIVE
191f0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
19200 20 20 20 7c 20 53 51 4c 49 54 45 5f 44 65 66 65     | SQLITE_Defe
19210 6e 73 69 76 65 0a 23 65 6e 64 69 66 0a 20 20 20  nsive.#endif.   
19220 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61     ;.  sqlite3Ha
19230 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c  shInit(&db->aCol
19240 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
19250 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
19260 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
19270 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
19280 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
19290 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
192a0 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
192b0 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
192c0 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
192d0 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
192e0 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
192f0 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
19300 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
19310 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
19320 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
19330 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
19340 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
19350 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
19360 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
19370 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d  *.  ** EVIDENCE-
19380 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38 37  OF: R-52786-4487
19390 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65 73  8 SQLite defines
193a0 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e 20   three built-in 
193b0 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66  collating.  ** f
193c0 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20  unctions:.  */. 
193d0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
193e0 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
193f0 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
19400 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  F8, 0, binCollFu
19410 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
19420 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
19430 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
19440 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
19450 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
19460 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
19470 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65  ation(db, sqlite
19480 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49  3StrBINARY, SQLI
19490 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62  TE_UTF16LE, 0, b
194a0 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
194b0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
194c0 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20  n(db, "NOCASE", 
194d0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
194e0 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
194f0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
19500 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
19510 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55  RTRIM", SQLITE_U
19520 54 46 38 2c 20 30 2c 20 72 74 72 69 6d 43 6f 6c  TF8, 0, rtrimCol
19530 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  lFunc, 0);.  if(
19540 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19550 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
19560 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
19570 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19580 52 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54 68  R-08308-17224 Th
19590 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
195a0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
195b0 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67   all.  ** string
195c0 73 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20  s is BINARY. .  
195d0 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f  */.  db->pDfltCo
195e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
195f0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
19600 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33  TE_UTF8, sqlite3
19610 53 74 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  StrBINARY, 0);. 
19620 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
19630 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
19640 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c  /* Parse the fil
19650 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65  ename/URI argume
19660 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c  nt.  **.  ** Onl
19670 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65  y allow sensible
19680 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
19690 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61   bits in the fla
196a0 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20  gs argument.  . 
196b0 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72   ** Throw an err
196c0 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65  or if any non-se
196d0 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  nse combination 
196e0 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a  is used.  If we.
196f0 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63    ** do not bloc
19700 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e  k illegal combin
19710 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20  ations here, it 
19720 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20  could trigger.  
19730 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ** assert() stat
19740 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72  ements in deeper
19750 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62   layers.  Sensib
19760 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a  le combinations.
19770 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20    ** are:.  **. 
19780 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f   **  1:  SQLITE_
19790 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  OPEN_READONLY.  
197a0 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f  **  2:  SQLITE_O
197b0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
197c0 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f  **  6:  SQLITE_O
197d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
197e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
197f0 54 45 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  TE.  */.  db->op
19800 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
19810 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
19820 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
19830 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73   == 0x01 );.  as
19840 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
19850 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30  N_READWRITE == 0
19860 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x02 );.  assert(
19870 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
19880 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29  ATE    == 0x04 )
19890 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  ;.  testcase( (1
198a0 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
198b0 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c  02 ); /* READONL
198c0 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  Y */.  testcase(
198d0 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
198e0 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44  =0x04 ); /* READ
198f0 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63  WRITE */.  testc
19900 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
19910 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20  7))==0x40 ); /* 
19920 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
19930 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c  TE */.  if( ((1<
19940 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78  <(flags&7)) & 0x
19950 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  46)==0 ){.    rc
19960 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45   = SQLITE_MISUSE
19970 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20  _BKPT;  /* IMP: 
19980 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f  R-65497-44594 */
19990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
199a0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
199b0 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
199c0 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
199d0 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
199e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
199f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19a00 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
19a10 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
19a20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
19a30 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
19a40 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
19a50 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22   rc, zErrMsg ? "
19a60 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67  %s" : 0, zErrMsg
19a70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19a80 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
19a90 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
19aa0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  t;.  }..  /* Ope
19ab0 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
19ac0 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
19ad0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
19ae0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
19af0 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64  s, zOpen, db, &d
19b00 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
19b10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19b20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
19b30 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
19b40 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
19b50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19b60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19b70 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
19b80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19b90 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19ba0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
19bb0 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
19bc0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
19bd0 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ut;.  }.  sqlite
19be0 33 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e  3BtreeEnter(db->
19bf0 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
19c00 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
19c10 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
19c20 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
19c30 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20  [0].pBt);.  if( 
19c40 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
19c50 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43  d ) ENC(db) = SC
19c60 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20  HEMA_ENC(db);.  
19c70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19c80 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
19c90 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
19ca0 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
19cb0 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
19cc0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  );..  /* The def
19cd0 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65  ault safety_leve
19ce0 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  l for the main d
19cf0 61 74 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b  atabase is FULL;
19d00 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
19d10 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
19d20 73 20 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63  s OFF. This matc
19d30 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61  hes the pager la
19d40 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a  yer defaults.  .
19d50 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30    */.  db->aDb[0
19d60 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61  ].zDbSName = "ma
19d70 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
19d80 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
19d90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
19da0 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20  SYNCHRONOUS+1;. 
19db0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53   db->aDb[1].zDbS
19dc0 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
19dd0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
19de0 74 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52  ty_level = PAGER
19df0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
19e00 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
19e10 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
19e20 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
19e30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19e40 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
19e50 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
19e60 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
19e70 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
19e80 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
19e90 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
19ea0 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
19eb0 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
19ec0 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
19ed0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
19ee0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
19ef0 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
19f00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
19f10 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
19f20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
19f30 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69  PerConnectionBui
19f40 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
19f50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19f60 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a  3_errcode(db);..
19f70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19f80 41 42 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52  ABLE_FTS5.  /* R
19f90 65 67 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c  egister any buil
19fa0 74 2d 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65  t-in FTS5 module
19fb0 20 62 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20   before loading 
19fc0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20  the automatic.  
19fd0 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54  ** extensions. T
19fe0 68 69 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d  his allows autom
19ff0 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
1a000 74 6f 20 72 65 67 69 73 74 65 72 20 46 54 53 35  to register FTS5
1a010 20 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72   .  ** tokenizer
1a020 73 20 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20  s and auxiliary 
1a030 66 75 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20  functions.  */. 
1a040 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1a050 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1a060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a070 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
1a080 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1a090 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61  dif..  /* Load a
1a0a0 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
1a0b0 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73  ons - extensions
1a0c0 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
1a0d0 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20  registered.  ** 
1a0e0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1a0f0 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65  3_automatic_exte
1a100 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
1a110 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1a120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
1a130 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65  ite3AutoLoadExte
1a140 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20  nsions(db);.    
1a150 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
1a160 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66  code(db);.    if
1a170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a180 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  ){.      goto op
1a190 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
1a1a0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1a1b0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
1a1c0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1a1d0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
1a1e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1a1f0 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
1a200 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
1a210 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
1a220 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1a230 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a240 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
1a250 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a260 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1a270 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
1a280 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
1a290 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
1a2a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
1a2b0 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
1a2c0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1a2d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1a2e0 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  3 /* automatical
1a2f0 6c 79 20 64 65 66 69 6e 65 64 20 62 79 20 53 51  ly defined by SQ
1a300 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
1a310 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   */.  if( !db->m
1a320 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
1a330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a340 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a350 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts3Init(db);.  
1a360 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
1a370 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1a380 42 4c 45 5f 49 43 55 29 20 7c 7c 20 64 65 66 69  BLE_ICU) || defi
1a390 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1a3a0 45 5f 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53  E_ICU_COLLATIONS
1a3b0 29 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ).  if( !db->mal
1a3c0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1a3d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a3e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
1a3f0 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
1a400 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1a410 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
1a420 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
1a430 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1a440 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
1a450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
1a460 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
1a470 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1a480 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
1a490 41 47 45 5f 56 54 41 42 0a 20 20 69 66 28 20 21  AGE_VTAB.  if( !
1a4a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a4b0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a4c0 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
1a4d0 69 74 65 33 44 62 70 61 67 65 52 65 67 69 73 74  ite3DbpageRegist
1a4e0 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  er(db);.  }.#end
1a4f0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1a500 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f  E_ENABLE_DBSTAT_
1a510 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e  VTAB.  if( !db->
1a520 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
1a530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
1a540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a550 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64  DbstatRegister(d
1a560 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1a570 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a580 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28  ABLE_JSON1.  if(
1a590 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1a5a0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
1a5b0 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
1a5c0 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28  qlite3Json1Init(
1a5d0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1a5e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a5f0 4e 41 42 4c 45 5f 53 54 4d 54 56 54 41 42 0a 20  NABLE_STMTVTAB. 
1a600 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1a610 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1a620 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
1a630 20 3d 20 73 71 6c 69 74 65 33 53 74 6d 74 56 74   = sqlite3StmtVt
1a640 61 62 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  abInit(db);.  }.
1a650 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53  #endif..  /* -DS
1a660 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
1a670 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
1a680 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
1a690 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
1a6a0 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
1a6b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
1a6c0 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
1a6d0 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
1a6e0 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
1a6f0 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
1a700 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
1a710 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
1a720 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
1a730 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a740 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
1a750 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
1a760 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
1a770 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
1a780 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
1a790 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
1a7a0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
1a7b0 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
1a7c0 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1a7e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
1a7f0 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
1a800 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73  if..  if( rc ) s
1a810 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
1a820 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c  rc);..  /* Enabl
1a830 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
1a840 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
1a850 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4c 6f 6f   */.  sqlite3Loo
1a860 6b 61 73 69 64 65 4f 70 65 6e 28 30 2c 20 73 71  kasideOpen(0, sq
1a870 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1a880 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20  g.szLookaside,. 
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
1a8b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
1a8c0 61 73 69 64 65 2c 20 26 64 62 2d 3e 6c 6f 6f 6b  aside, &db->look
1a8d0 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74  aside);..  sqlit
1a8e0 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
1a8f0 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45  point(db, SQLITE
1a900 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54  _DEFAULT_WAL_AUT
1a910 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f  OCHECKPOINT);..o
1a920 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28  pendb_out:.  if(
1a930 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72   db ){.    asser
1a940 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20  t( db->mutex!=0 
1a950 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d  || isThreadsafe=
1a960 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
1a970 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a980 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d  nfig.bFullMutex=
1a990 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1a9a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1a9b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
1a9c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
1a9d0 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65  code(db);.  asse
1a9e0 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d  rt( db!=0 || rc=
1a9f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
1aa00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1aa10 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
1aa20 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
1aa30 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20  ;.    db = 0;.  
1aa40 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
1aa50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
1aa60 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1aa70 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20  E_MAGIC_SICK;.  
1aa80 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a  }.  *ppDb = db;.
1aa90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1aaa0 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
1aab0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1aac0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
1aad0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20  .    /* Opening 
1aae0 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75  a db handle. Fou
1aaf0 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73  rth parameter is
1ab00 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20   passed 0. */.  
1ab10 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73    void *pArg = s
1ab20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ab30 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20  ig.pSqllogArg;. 
1ab40 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1ab50 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70  Config.xSqllog(p
1ab60 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61  Arg, db, zFilena
1ab70 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  me, 0);.  }.#end
1ab80 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
1ab90 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
1aba0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1abb0 45 5f 4f 4b 20 29 20 73 71 6c 69 74 65 33 43 6f  E_OK ) sqlite3Co
1abc0 64 65 63 51 75 65 72 79 50 61 72 61 6d 65 74 65  decQueryParamete
1abd0 72 73 28 64 62 2c 20 30 2c 20 7a 4f 70 65 6e 29  rs(db, 0, zOpen)
1abe0 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1abf0 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a  e3_free(zOpen);.
1ac00 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 30 78    return rc & 0x
1ac10 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ff;.}.../*.** Op
1ac20 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
1ac30 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
1ac40 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20   sqlite3_open(. 
1ac50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1ac60 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
1ac70 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20  e3 **ppDb .){.  
1ac80 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
1ac90 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ase(zFilename, p
1aca0 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
1acb0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1acc0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1acd0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
1ace0 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74  REATE, 0);.}.int
1acf0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1ad00 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1ad10 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44  filename,   /* D
1ad20 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
1ad30 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
1ad40 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
1ad50 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51        /* OUT: SQ
1ad60 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a  Lite db handle *
1ad70 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ad90 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
1ada0 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
1adb0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
1adc0 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a   module to use *
1add0 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  /.){.  return op
1ade0 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e  enDatabase(filen
1adf0 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69  ame, ppDb, (unsi
1ae00 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20  gned int)flags, 
1ae10 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zVfs);.}..#ifnde
1ae20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1ae30 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
1ae40 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
1ae50 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
1ae60 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
1ae70 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
1ae80 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
1ae90 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
1aea0 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
1aeb0 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
1aec0 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
1aed0 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
1aee0 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69  UTF-16 */.  sqli
1aef0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
1af00 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64  .  int rc;..#ifd
1af10 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1af20 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1af30 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72   ppDb==0 ) retur
1af40 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1af50 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a  BKPT;.#endif.  *
1af60 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
1af70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1af80 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
1af90 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1afa0 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
1afb0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
1afc0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1afd0 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20  ==0 ) zFilename 
1afe0 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20  = "\000\000";.  
1aff0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
1b000 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
1b010 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
1b020 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  pVal, -1, zFilen
1b030 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ame, SQLITE_UTF1
1b040 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f  6NATIVE, SQLITE_
1b050 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65  STATIC);.  zFile
1b060 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56  name8 = sqlite3V
1b070 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53  alueText(pVal, S
1b080 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69  QLITE_UTF8);.  i
1b090 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b  f( zFilename8 ){
1b0a0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61  .    rc = openDa
1b0b0 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
1b0c0 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  8, ppDb,.       
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1b0e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1b0f0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1b100 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20  EN_CREATE, 0);. 
1b110 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62     assert( *ppDb
1b120 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
1b130 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20  OMEM );.    if( 
1b140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b150 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
1b160 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68  *ppDb, 0, DB_Sch
1b170 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20  emaLoaded) ){.  
1b180 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 2a      SCHEMA_ENC(*
1b190 70 70 44 62 29 20 3d 20 45 4e 43 28 2a 70 70 44  ppDb) = ENC(*ppD
1b1a0 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  b) = SQLITE_UTF1
1b1b0 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20  6NATIVE;.    }. 
1b1c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1b1d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1b1e0 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
1b1f0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
1b200 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26  ;..  return rc &
1b210 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66 20   0xff;.}.#endif 
1b220 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1b230 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
1b240 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
1b250 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1b260 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1b270 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
1b280 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
1b290 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
1b2a0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
1b2b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1b2c0 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
1b2d0 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
1b2e0 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
1b2f0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
1b300 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
1b310 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75  void*).){.  retu
1b320 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
1b330 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64  e_collation_v2(d
1b340 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70  b, zName, enc, p
1b350 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
1b360 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  );.}../*.** Regi
1b370 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
1b380 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
1b390 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1b3a0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
1b3b0 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
1b3c0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
1b3d0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
1b3e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1b3f0 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
1b400 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
1b410 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
1b420 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
1b430 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
1b440 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
1b450 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
1b460 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65    int rc;..#ifde
1b470 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b480 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1b490 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1b4a0 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
1b4b0 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  me==0 ) return S
1b4c0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1b4d0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1b4e0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b4f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
1b500 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
1b510 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
1b520 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
1b530 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
1b540 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
1b550 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
1b560 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
1b570 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
1b580 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1b590 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1b5a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1b5b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b5c0 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
1b5d0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
1b5e0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b5f0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1b600 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
1b610 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
1b620 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
1b630 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
1b640 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
1b650 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20  ame,.  int enc, 
1b660 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
1b670 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
1b680 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
1b690 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
1b6a0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
1b6b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b6c0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a    char *zName8;.
1b6d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b6e0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1b6f0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1b700 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1b710 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  || zName==0 ) re
1b720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1b730 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1b740 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b750 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1b760 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
1b770 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1b780 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69  .  zName8 = sqli
1b790 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
1b7a0 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
1b7b0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
1b7c0 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a    if( zName8 ){.
1b7d0 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43      rc = createC
1b7e0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
1b7f0 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  me8, (u8)enc, pC
1b800 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
1b810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1b820 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b  ree(db, zName8);
1b830 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1b840 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
1b850 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
1b860 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1b870 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1b880 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
1b890 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1b8a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
1b8b0 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
1b8c0 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
1b8d0 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
1b8e0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
1b8f0 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
1b900 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
1b910 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
1b920 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
1b930 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
1b940 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
1b950 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65  needed(.  sqlite
1b960 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
1b970 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
1b980 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
1b990 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69  eded)(void*,sqli
1b9a0 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
1b9b0 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  p,const char*).)
1b9c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1b9d0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1b9e0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1b9f0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1ba00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1ba10 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1ba20 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1ba30 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1ba40 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
1ba50 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c  llNeeded = xColl
1ba60 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43  Needed;.  db->xC
1ba70 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b  ollNeeded16 = 0;
1ba80 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
1ba90 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
1baa0 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
1bab0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1bac0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1bad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1bae0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1baf0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
1bb00 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
1bb10 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
1bb20 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
1bb30 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1bb40 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
1bb50 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
1bb60 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
1bb70 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1bb80 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
1bb90 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
1bba0 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a  ation_needed16(.
1bbb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
1bbc0 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
1bbd0 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
1bbe0 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28  *xCollNeeded16)(
1bbf0 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
1bc00 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
1bc10 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64  t void*).){.#ifd
1bc20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1bc30 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1bc40 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1bc50 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
1bc60 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1bc70 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1bc80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1bc90 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1bca0 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
1bcb0 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
1bcc0 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
1bcd0 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
1bce0 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
1bcf0 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
1bd00 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
1bd10 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1bd20 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1bd30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1bd40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1bd50 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
1bd60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bd70 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
1bd80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1bd90 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
1bda0 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
1bdb0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
1bdc0 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
1bdd0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
1bde0 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
1bdf0 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
1be00 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
1be10 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
1be20 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
1be30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1be40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1be50 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
1be60 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
1be70 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1be80 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
1be90 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
1bea0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
1beb0 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
1bec0 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
1bed0 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
1bee0 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
1bef0 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
1bf00 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
1bf10 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
1bf20 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
1bf30 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
1bf40 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74  ROLLBACK..*/.int
1bf50 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
1bf60 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  ocommit(sqlite3 
1bf70 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
1bf80 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1bf90 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1bfa0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1bfb0 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
1bfc0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
1bfd0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
1bfe0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
1bff0 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
1c000 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Commit;.}../*.**
1c010 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
1c020 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 73  outines are subs
1c030 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
1c040 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
1c050 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
1c060 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
1c070 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
1c080 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73 73 69 62  NOMEM and possib
1c090 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
1c0a0 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
1c0b0 65 79 20 73 65 72 76 65 20 74 77 6f 20 70 75 72  ey serve two pur
1c0c0 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  poses:.**.**   1
1c0d0 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f  .  Serve as a co
1c0e0 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
1c0f0 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
1c100 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72  nt in a debugger
1c110 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74  .**       to det
1c120 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e  ect when version
1c130 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
1c140 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  s occurs..**.** 
1c150 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c    2.  Invoke sql
1c160 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72  ite3_log() to pr
1c170 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65  ovide the source
1c180 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77   code location w
1c190 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20  here.**       a 
1c1a0 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
1c1b0 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65  is first detecte
1c1c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c1d0 33 52 65 70 6f 72 74 45 72 72 6f 72 28 69 6e 74  3ReportError(int
1c1e0 20 69 45 72 72 2c 20 69 6e 74 20 6c 69 6e 65 6e   iErr, int linen
1c1f0 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  o, const char *z
1c200 54 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Type){.  sqlite3
1c210 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25 73 20 61  _log(iErr, "%s a
1c220 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e  t line %d of [%.
1c230 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  10s]",.         
1c240 20 20 20 20 20 7a 54 79 70 65 2c 20 6c 69 6e 65       zType, line
1c250 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
1c260 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
1c270 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a 69 6e 74  turn iErr;.}.int
1c280 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45   sqlite3CorruptE
1c290 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1c2a0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1c2b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1c2c0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1c2d0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1c2e0 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1c2f0 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c  CORRUPT, lineno,
1c300 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75   "database corru
1c310 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e 74 20 73  ption");.}.int s
1c320 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f  qlite3MisuseErro
1c330 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
1c340 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1c350 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1c360 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Log!=0 );.  retu
1c370 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74  rn sqlite3Report
1c380 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4d 49 53  Error(SQLITE_MIS
1c390 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20 22 6d 69  USE, lineno, "mi
1c3a0 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74 20 73 71  suse");.}.int sq
1c3b0 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72  lite3CantopenErr
1c3c0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1c3d0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1c3e0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c3f0 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1c400 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1c410 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  tError(SQLITE_CA
1c420 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f 2c 20  NTOPEN, lineno, 
1c430 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
1c440 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  e");.}.#ifdef SQ
1c450 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
1c460 71 6c 69 74 65 33 43 6f 72 72 75 70 74 50 67 6e  qlite3CorruptPgn
1c470 6f 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  oError(int linen
1c480 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  o, Pgno pgno){. 
1c490 20 63 68 61 72 20 7a 4d 73 67 5b 31 30 30 5d 3b   char zMsg[100];
1c4a0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1c4b0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4d 73 67 29  ntf(sizeof(zMsg)
1c4c0 2c 20 7a 4d 73 67 2c 20 22 64 61 74 61 62 61 73  , zMsg, "databas
1c4d0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67  e corruption pag
1c4e0 65 20 25 64 22 2c 20 70 67 6e 6f 29 3b 0a 20 20  e %d", pgno);.  
1c4f0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1c500 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1c510 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  og!=0 );.  retur
1c520 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45  n sqlite3ReportE
1c530 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52 52  rror(SQLITE_CORR
1c540 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 4d 73  UPT, lineno, zMs
1c550 67 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  g);.}.int sqlite
1c560 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20  3NomemError(int 
1c570 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
1c580 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
1c590 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
1c5a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
1c5b0 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28  ite3ReportError(
1c5c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 6c 69  SQLITE_NOMEM, li
1c5d0 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a 7d 0a  neno, "OOM");.}.
1c5e0 69 6e 74 20 73 71 6c 69 74 65 33 49 6f 65 72 72  int sqlite3Ioerr
1c5f0 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c  nomemError(int l
1c600 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1c610 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1c620 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1c630 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1c640 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53  te3ReportError(S
1c650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1c660 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f 4f 20  M, lineno, "I/O 
1c670 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a 7d 0a 23  OOM error");.}.#
1c680 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
1c690 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
1c6a0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
1c6b0 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
1c6c0 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
1c6d0 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
1c6e0 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
1c6f0 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
1c700 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
1c710 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
1c720 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
1c730 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
1c740 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
1c750 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
1c760 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
1c770 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
1c780 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
1c790 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
1c7a0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
1c7b0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
1c7c0 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69  p(void){.}.#endi
1c7d0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
1c7e0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
1c7f0 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69   about a specifi
1c800 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61  c column of a da
1c810 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
1c820 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20   See comment in 
1c830 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74  sqlite3.h (sqlit
1c840 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61  e.h.in) for deta
1c850 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
1c860 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
1c870 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c  _metadata(.  sql
1c880 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1c890 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
1c8a0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f  ection handle */
1c8b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c8c0 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  DbName,        /
1c8d0 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
1c8e0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
1c8f0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e  st char *zTableN
1c900 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  ame,     /* Tabl
1c910 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73  e name */.  cons
1c920 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e  t char *zColumnN
1c930 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  ame,    /* Colum
1c940 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72  n name */.  char
1c950 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54   const **pzDataT
1c960 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55  ype,    /* OUTPU
1c970 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61  T: Declared data
1c980 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
1c990 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65  const **pzCollSe
1c9a0 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  q,     /* OUTPUT
1c9b0 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  : Collation sequ
1c9c0 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  ence name */.  i
1c9d0 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20  nt *pNotNull,   
1c9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1c9f0 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f  TPUT: True if NO
1ca00 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
1ca10 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e  t exists */.  in
1ca20 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20  t *pPrimaryKey, 
1ca30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1ca40 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
1ca50 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a  umn part of PK *
1ca60 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e  /.  int *pAutoin
1ca70 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
1ca80 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1ca90 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74  if column is aut
1caa0 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29  o-increment */.)
1cab0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
1cac0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
1cad0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
1cae0 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   0;.  Column *pC
1caf0 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  ol = 0;.  int iC
1cb00 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ol = 0;.  char c
1cb10 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20  onst *zDataType 
1cb20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
1cb30 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b  t *zCollSeq = 0;
1cb40 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d  .  int notnull =
1cb50 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72   0;.  int primar
1cb60 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ykey = 0;.  int 
1cb70 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23  autoinc = 0;...#
1cb80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1cb90 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1cba0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1cbb0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
1cbc0 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29   zTableName==0 )
1cbd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1cbe0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1cbf0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1cc00 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74  * Ensure the dat
1cc10 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
1cc20 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a   been loaded */.
1cc30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1cc40 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1cc50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1cc60 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
1cc70 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
1cc80 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  (db, &zErrMsg);.
1cc90 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1cca0 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =rc ){.    goto 
1ccb0 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
1ccc0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
1ccd0 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
1cce0 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71  n */.  pTab = sq
1ccf0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
1cd00 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  b, zTableName, z
1cd10 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  DbName);.  if( !
1cd20 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53  pTab || pTab->pS
1cd30 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61  elect ){.    pTa
1cd40 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  b = 0;.    goto 
1cd50 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
1cd60 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f    /* Find the co
1cd70 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69  lumn for which i
1cd80 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64  nfo is requested
1cd90 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d   */.  if( zColum
1cda0 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nName==0 ){.    
1cdb0 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 65 78 69  /* Query for exi
1cdc0 73 74 61 6e 63 65 20 6f 66 20 74 61 62 6c 65 20  stance of table 
1cdd0 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  only */.  }else{
1cde0 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
1cdf0 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
1ce00 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
1ce10 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
1ce20 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
1ce30 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
1ce40 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
1ce50 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  me, zColumnName)
1ce60 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1ce70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1ce80 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70  .    if( iCol==p
1ce90 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
1cea0 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
1ceb0 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
1cec0 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e  IsRowid(zColumnN
1ced0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
1cee0 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
1cef0 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ey;.        pCol
1cf00 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54   = iCol>=0 ? &pT
1cf10 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a  ab->aCol[iCol] :
1cf20 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1cf30 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
1cf40 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
1cf50 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20  error_out;.     
1cf60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1cf70 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1cf80 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68   block stores th
1cf90 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  e meta informati
1cfa0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  on that will be 
1cfb0 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f  returned.  ** to
1cfc0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c   the caller in l
1cfd0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a  ocal variables z
1cfe0 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53  DataType, zCollS
1cff0 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69  eq, notnull, pri
1d000 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64  marykey.  ** and
1d010 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69   autoinc. At thi
1d020 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72  s point there ar
1d030 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74  e two possibilit
1d040 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ies:.  ** .  ** 
1d050 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69      1. The speci
1d060 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fied column name
1d070 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69   was rowid", "oi
1d080 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20  d" or "_rowid_" 
1d090 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  .  **        and
1d0a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70   there is no exp
1d0b0 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
1d0c0 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20   IPK column. .  
1d0d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54  **.  **     2. T
1d0e0 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  he table is not 
1d0f0 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63  a view and the c
1d100 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74  olumn name ident
1d110 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20  ified an .  **  
1d120 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79        explicitly
1d130 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
1d140 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f  . Copy meta info
1d150 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43  rmation from *pC
1d160 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ol..  */ .  if( 
1d170 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74  pCol ){.    zDat
1d180 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  aType = sqlite3C
1d190 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 30  olumnType(pCol,0
1d1a0 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  );.    zCollSeq 
1d1b0 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
1d1c0 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f     notnull = pCo
1d1d0 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20  l->notNull!=0;. 
1d1e0 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d     primarykey  =
1d1f0 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
1d200 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
1d210 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f  EY)!=0;.    auto
1d220 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  inc = pTab->iPKe
1d230 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62  y==iCol && (pTab
1d240 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1d250 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
1d260 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1d270 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54  zDataType = "INT
1d280 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61  EGER";.    prima
1d290 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20  rykey = 1;.  }. 
1d2a0 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29   if( !zCollSeq )
1d2b0 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  {.    zCollSeq =
1d2c0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1d2d0 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  Y;.  }..error_ou
1d2e0 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t:.  sqlite3Btre
1d2f0 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
1d300 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
1d310 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
1d320 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
1d330 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
1d340 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
1d350 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
1d360 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
1d370 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
1d380 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
1d390 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
1d3a0 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
1d3b0 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
1d3c0 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1d3d0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
1d3e0 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
1d3f0 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
1d400 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
1d410 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
1d420 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
1d430 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
1d440 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
1d450 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
1d460 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
1d470 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
1d480 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
1d490 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
1d4a0 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
1d4b0 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
1d4c0 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
1d4d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1d4e0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
1d4f0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
1d500 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
1d510 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
1d520 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
1d530 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
1d540 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
1d550 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1d560 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1d570 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
1d580 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73  rc, (zErrMsg?"%s
1d590 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  ":0), zErrMsg);.
1d5a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d5b0 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1d5c0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
1d5d0 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
1d5e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1d5f0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1d600 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d610 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
1d620 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
1d630 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
1d640 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
1d650 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1d660 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
1d670 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1d680 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
1d690 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
1d6a0 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
1d6b0 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
1d6c0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
1d6d0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
1d6e0 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
1d6f0 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
1d700 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
1d710 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
1d720 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
1d730 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
1d740 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
1d750 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
1d760 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
1d770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d780 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
1d790 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
1d7a0 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
1d7b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d7c0 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
1d7d0 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
1d7e0 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
1d7f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1d800 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1d810 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1d820 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1d830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1d840 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1d850 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1d860 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1d870 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
1d880 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66  sk = onoff ? 0xf
1d890 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a  fffffff : 0xff;.
1d8a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d8b0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1d8c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d8d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1d8e0 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43  nvoke the xFileC
1d8f0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e  ontrol method on
1d900 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1d910 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
1d920 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1d930 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  rol(sqlite3 *db,
1d940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1d950 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  Name, int op, vo
1d960 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
1d970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1d980 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  OR;.  Btree *pBt
1d990 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ree;..#ifdef SQL
1d9a0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1d9b0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1d9c0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1d9d0 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1d9e0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1d9f0 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1da00 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1da10 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
1da20 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  ree = sqlite3DbN
1da30 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1da40 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  DbName);.  if( p
1da50 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
1da60 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
1da70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1da80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1da90 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1daa0 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
1dab0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1dac0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
1dad0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1dae0 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74  ;.    fd = sqlit
1daf0 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
1db00 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1db10 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   fd!=0 );.    if
1db20 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
1db30 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  TL_FILE_POINTER 
1db40 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1db50 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
1db60 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   fd;.      rc = 
1db70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1db80 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1db90 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f  ITE_FCNTL_VFS_PO
1dba0 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1dbb0 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70  (sqlite3_vfs**)p
1dbc0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Arg = sqlite3Pag
1dbd0 65 72 56 66 73 28 70 50 61 67 65 72 29 3b 0a 20  erVfs(pPager);. 
1dbe0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1dbf0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1dc00 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1dc10 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e  NTL_JOURNAL_POIN
1dc20 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1dc30 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1dc40 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rg = sqlite3Page
1dc50 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67 65 72  rJrnlFile(pPager
1dc60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1dc70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1dc80 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1dc90 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52  E_FCNTL_DATA_VER
1dca0 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2a 28  SION ){.      *(
1dcb0 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29 70 41  unsigned int*)pA
1dcc0 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rg = sqlite3Page
1dcd0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 70 50 61  rDataVersion(pPa
1dce0 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1dcf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1dd00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1dd10 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
1dd20 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70  ontrol(fd, op, p
1dd30 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
1dd40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1dd50 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
1dd60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1dd70 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1dd80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dd90 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1dda0 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
1ddb0 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
1ddc0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1ddd0 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
1dde0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
1ddf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54  ifdef SQLITE_UNT
1de00 45 53 54 41 42 4c 45 0a 20 20 55 4e 55 53 45 44  ESTABLE.  UNUSED
1de10 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a  _PARAMETER(op);.
1de20 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20  #else.  va_list 
1de30 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1de40 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
1de50 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
1de60 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
1de70 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1de80 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
1de90 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1dea0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1deb0 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
1dec0 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
1ded0 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
1dee0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1def0 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
1df00 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1df10 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
1df20 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
1df30 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
1df40 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
1df50 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
1df60 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
1df70 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1df80 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
1df90 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
1dfa0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1dfb0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1dfc0 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
1dfd0 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
1dfe0 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
1dff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e000 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
1e010 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e020 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e030 50 52 4e 47 5f 53 45 45 44 2c 20 69 6e 74 20 78  PRNG_SEED, int x
1e040 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29 3b 0a  , sqlite3 *db);.
1e050 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f      **.    ** Co
1e060 6e 74 72 6f 6c 20 74 68 65 20 73 65 65 64 20 66  ntrol the seed f
1e070 6f 72 20 74 68 65 20 70 73 65 75 64 6f 2d 72 61  or the pseudo-ra
1e080 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65  ndom number gene
1e090 72 61 74 6f 72 20 28 50 52 4e 47 29 20 74 68 61  rator (PRNG) tha
1e0a0 74 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c  t.    ** is buil
1e0b0 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e 20 20  t into SQLite.  
1e0c0 43 61 73 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  Cases:.    **.  
1e0d0 20 20 2a 2a 20 20 20 20 78 21 3d 30 20 26 26 20    **    x!=0 && 
1e0e0 64 62 21 3d 30 20 20 20 20 20 20 20 53 65 65 64  db!=0       Seed
1e0f0 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
1e100 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
1e110 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 20 20 20  f the.    **    
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 20 20 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69      schema cooki
1e140 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
1e150 74 61 62 61 73 65 20 66 6f 72 20 64 62 2c 20 6f  tabase for db, o
1e160 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  r.    **        
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e180 78 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  x if the schema 
1e190 63 6f 6f 6b 69 65 20 69 73 20 7a 65 72 6f 2e 20  cookie is zero. 
1e1a0 20 54 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   This case.    *
1e1b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e1c0 20 20 20 20 20 20 20 20 20 69 73 20 63 6f 6e 76           is conv
1e1d0 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20 77 69  enient to use wi
1e1e0 74 68 20 64 61 74 61 62 61 73 65 20 66 75 7a 7a  th database fuzz
1e1f0 65 72 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ers.    **      
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 20 61 73 20 69 74 20 61 6c 6c 6f 77 73 20 74    as it allows t
1e220 68 65 20 66 75 7a 7a 65 72 20 73 6f 6d 65 20 63  he fuzzer some c
1e230 6f 6e 74 72 6f 6c 20 6f 76 65 72 20 74 68 65 0a  ontrol over the.
1e240 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1e260 65 20 50 52 4e 47 20 73 65 65 64 2e 0a 20 20 20  e PRNG seed..   
1e270 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 21   **.    **    x!
1e280 3d 30 20 26 26 20 64 62 3d 3d 30 20 20 20 20 20  =0 && db==0     
1e290 20 20 53 65 65 64 20 74 68 65 20 50 52 4e 47 20    Seed the PRNG 
1e2a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
1e2b0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
1e2c0 20 20 20 20 78 3d 3d 30 20 26 26 20 64 62 3d 3d      x==0 && db==
1e2d0 30 20 20 20 20 20 20 20 52 65 76 65 72 74 20 74  0       Revert t
1e2e0 6f 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  o default behavi
1e2f0 6f 72 20 6f 66 20 75 73 69 6e 67 20 74 68 65 0a  or of using the.
1e300 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 52                xR
1e320 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
1e330 20 6f 6e 20 74 68 65 20 70 72 69 6d 61 72 79 20   on the primary 
1e340 56 46 53 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  VFS..    **.    
1e350 2a 2a 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e  ** This test-con
1e360 74 72 6f 6c 20 61 6c 73 6f 20 72 65 73 65 74 73  trol also resets
1e370 20 74 68 65 20 50 52 4e 47 20 73 6f 20 74 68 61   the PRNG so tha
1e380 74 20 74 68 65 20 6e 65 77 20 73 65 65 64 20 77  t the new seed w
1e390 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 75 73  ill.    ** be us
1e3a0 65 64 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ed for the next 
1e3b0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
1e3c0 72 61 6e 64 6f 6d 6e 65 73 73 28 29 2e 0a 20 20  randomness()..  
1e3d0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1e3e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1e3f0 4e 47 5f 53 45 45 44 3a 20 7b 0a 20 20 20 20 20  NG_SEED: {.     
1e400 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
1e410 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1e420 69 6e 74 20 79 3b 0a 20 20 20 20 20 20 73 71 6c  int y;.      sql
1e430 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1e440 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1e450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
1e460 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  b==0 || db->aDb[
1e470 30 5d 2e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b  0].pSchema!=0 );
1e480 0a 20 20 20 20 20 20 69 66 28 20 64 62 20 26 26  .      if( db &&
1e490 20 28 79 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d   (y = db->aDb[0]
1e4a0 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
1e4b0 5f 63 6f 6f 6b 69 65 29 21 3d 30 20 29 7b 20 78  _cookie)!=0 ){ x
1e4c0 20 3d 20 79 3b 20 7d 0a 20 20 20 20 20 20 73 71   = y; }.      sq
1e4d0 6c 69 74 65 33 43 6f 6e 66 69 67 2e 69 50 72 6e  lite3Config.iPrn
1e4e0 67 53 65 65 64 20 3d 20 78 3b 0a 20 20 20 20 20  gSeed = x;.     
1e4f0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1e500 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20  ess(0,0);.      
1e510 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e520 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1e530 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e540 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
1e550 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
1e560 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
1e570 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
1e580 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
1e590 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
1e5a0 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
1e5b0 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
1e5c0 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
1e5d0 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
1e5e0 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
1e5f0 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
1e600 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
1e610 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
1e620 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
1e630 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
1e640 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
1e650 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
1e660 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
1e670 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1e680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e690 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e6a0 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
1e6b0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
1e6c0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1e6d0 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
1e6e0 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
1e6f0 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
1e700 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
1e710 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
1e720 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
1e730 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1e740 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1e750 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41  _test_control(FA
1e760 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61  ULT_INSTALL, xCa
1e770 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20  llback).    **. 
1e780 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f     ** Arrange to
1e790 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63   invoke xCallbac
1e7a0 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c  k() whenever sql
1e7b0 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69  ite3FaultSim() i
1e7c0 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a  s called,.    **
1e7d0 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73   if xCallback is
1e7e0 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
1e7f0 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65  *.    ** As a te
1e800 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20  st of the fault 
1e810 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e  simulator mechan
1e820 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69  ism itself, sqli
1e830 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20  te3FaultSim(0). 
1e840 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20     ** is called 
1e850 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
1e860 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65  r installing the
1e870 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e   new callback an
1e880 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20  d the return.   
1e890 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73   ** value from s
1e8a0 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1e8b0 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65  ) becomes the re
1e8c0 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  turn from.    **
1e8d0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e8e0 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a  ntrol()..    */.
1e8f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e900 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49  TESTCTRL_FAULT_I
1e910 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  NSTALL: {.      
1e920 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
1e930 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
1e940 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
1e950 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
1e960 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
1e970 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
1e980 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
1e990 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1e9a0 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
1e9b0 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  k = va_arg(ap, i
1e9c0 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20  nt(*)(int));.   
1e9d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
1e9e0 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c  def int(*TESTCAL
1e9f0 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74  LBACKFUNC_t)(int
1ea00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ea10 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
1ea20 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
1ea30 61 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c  arg(ap, TESTCALL
1ea40 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20  BACKFUNC_t);.   
1ea50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1ea60 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20  aultSim(0);.    
1ea70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1ea80 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1ea90 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1eaa0 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
1eab0 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
1eac0 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
1ead0 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
1eae0 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
1eaf0 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
1eb00 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
1eb10 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
1eb20 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
1eb30 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1eb40 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
1eb50 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
1eb60 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1eb70 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
1eb80 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
1eb90 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
1eba0 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
1ebb0 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
1ebc0 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
1ebd0 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
1ebe0 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
1ebf0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
1ec00 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
1ec10 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
1ec20 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
1ec30 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
1ec40 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
1ec50 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
1ec60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ec70 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1ec80 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1ec90 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1eca0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1ecb0 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
1ecc0 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1ecd0 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
1ece0 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
1ecf0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
1ed00 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
1ed10 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
1ed20 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
1ed30 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
1ed40 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
1ed50 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
1ed60 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
1ed70 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1ed80 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
1ed90 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
1eda0 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
1edb0 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
1edc0 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
1edd0 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
1ede0 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
1edf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1ee00 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
1ee10 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1ee20 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
1ee30 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
1ee40 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
1ee50 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
1ee60 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
1ee70 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  eleterious behav
1ee80 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
1ee90 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1eea0 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
1eeb0 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
1eec0 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
1eed0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1eee0 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
1eef0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
1ef00 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
1ef10 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
1ef20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
1ef30 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
1ef40 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
1ef50 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
1ef60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1ef70 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1ef80 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1ef90 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1efa0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1efb0 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
1efc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1efd0 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1efe0 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1eff0 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
1f000 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
1f010 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
1f020 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1f030 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
1f040 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
1f050 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
1f060 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1f070 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
1f080 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
1f090 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
1f0a0 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
1f0b0 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
1f0c0 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
1f0d0 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
1f0e0 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1f0f0 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
1f100 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
1f110 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
1f120 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
1f130 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
1f140 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1f150 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
1f160 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1f170 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
1f180 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
1f190 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f1a0 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
1f1b0 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
1f1c0 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
1f1d0 73 73 65 72 74 28 20 2f 2a 73 69 64 65 2d 65 66  ssert( /*side-ef
1f1e0 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20  fects-ok*/ (x = 
1f1f0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
1f200 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
1f210 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
1f220 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1f230 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1f240 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1f250 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1f260 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
1f270 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1f280 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1f290 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1f2a0 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
1f2b0 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
1f2c0 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
1f2d0 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
1f2e0 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
1f2f0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
1f300 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
1f310 41 59 53 28 58 29 20 69 66 20 58 20 69 73 20 74  AYS(X) if X is t
1f320 72 75 65 2c 20 6f 72 20 30 20 69 66 20 58 20 69  rue, or 0 if X i
1f330 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 0a  s false..    **.
1f340 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d      ** The recom
1f350 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20 58  mended test is X
1f360 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65 74  ==2.  If the ret
1f370 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20  urn value is 2, 
1f380 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  that means.    *
1f390 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  * ALWAYS() and N
1f3a0 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68 20  EVER() are both 
1f3b0 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
1f3c0 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68  gh macros, which
1f3d0 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   is the.    ** d
1f3e0 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20  efault setting. 
1f3f0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
1f400 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20  alue is 1, then 
1f410 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74 68  ALWAYS() is eith
1f420 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63  er.    ** hard-c
1f430 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20  oded to true or 
1f440 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73 20  else it asserts 
1f450 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  if its argument 
1f460 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1f470 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61 76   The first behav
1f480 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20  ior (hard-coded 
1f490 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65 20  to true) is the 
1f4a0 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
1f4b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1f4c0 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
1f4d0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1f4e0 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65  abled and the se
1f4f0 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61  cond.    ** beha
1f500 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66 20  vior (assert if 
1f510 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1f520 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c 73  ALWAYS() is fals
1f530 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
1f540 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
1f550 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
1f560 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
1f570 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  t() is enabled..
1f580 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f590 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  e run-time test 
1f5a0 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20  procedure might 
1f5b0 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c  look something l
1f5c0 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
1f5d0 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73  .    **    if( s
1f5e0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f5f0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f600 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d  TRL_ALWAYS, 2)==
1f610 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  2 ){.    **     
1f620 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64   // ALWAYS() and
1f630 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d   NEVER() are no-
1f640 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
1f650 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20  macros.    **   
1f660 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
1f670 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1f680 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f690 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20  ASSERT, 1) ){.  
1f6a0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1f6b0 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20 74  AYS(x) asserts t
1f6c0 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e  hat x is true. N
1f6d0 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73 20  EVER(x) asserts 
1f6e0 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  x is false..    
1f6f0 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  **    }else{.   
1f700 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
1f710 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  YS(x) is a const
1f720 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29  ant 1.  NEVER(x)
1f730 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30   is a constant 0
1f740 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20  ..    **    }.  
1f750 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1f760 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1f770 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WAYS: {.      in
1f780 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
1f790 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
1f7a0 20 78 20 3f 20 41 4c 57 41 59 53 28 78 29 20 3a   x ? ALWAYS(x) :
1f7b0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1f7c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1f7d0 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f     **   sqlite3_
1f7e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1f7f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54  ITE_TESTCTRL_BYT
1f800 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a  EORDER);.    **.
1f810 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67      ** The integ
1f820 65 72 20 72 65 74 75 72 6e 65 64 20 72 65 76 65  er returned reve
1f830 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64  als the byte-ord
1f840 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74  er of the comput
1f850 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  er on which.    
1f860 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e  ** SQLite is run
1f870 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ning:.    **.   
1f880 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20 20   **       1     
1f890 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64  big-endian,    d
1f8a0 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e  etermined at run
1f8b0 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20  -time.    **    
1f8c0 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d    10     little-
1f8d0 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e  endian, determin
1f8e0 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1f8f0 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20     **  432101   
1f900 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
1f910 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63   determined at c
1f920 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20  ompile-time.    
1f930 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20 20 6c  **  123410     l
1f940 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65  ittle-endian, de
1f950 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70  termined at comp
1f960 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20  ile-time.    */ 
1f970 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f980 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
1f990 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  DER: {.      rc 
1f9a0 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  = SQLITE_BYTEORD
1f9b0 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f  ER*100 + SQLITE_
1f9c0 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20  LITTLEENDIAN*10 
1f9d0 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49  + SQLITE_BIGENDI
1f9e0 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  AN;.      break;
1f9f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1fa00 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1fa10 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1fa20 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73  TCTRL_RESERVE, s
1fa30 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1fa40 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
1fa50 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76   Set the nReserv
1fa60 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20  e size to N for 
1fa70 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1fa80 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
1fa90 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  e.    ** connect
1faa0 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20  ion db..    */. 
1fab0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1fac0 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a  ESTCTRL_RESERVE:
1fad0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1fae0 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1faf0 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1fb00 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
1fb10 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1fb20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1fb30 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1fb40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1fb50 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64  reeSetPageSize(d
1fb60 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
1fb70 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , x, 0);.      s
1fb80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1fb90 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1fba0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fbb0 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
1fbc0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1fbd0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fbe0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73  OPTIMIZATIONS, s
1fbf0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1fc00 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
1fc10 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
1fc20 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  le various optim
1fc30 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73  izations for tes
1fc40 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
1fc50 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75  The .    ** argu
1fc60 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d  ment N is a bitm
1fc70 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74  ask of optimizat
1fc80 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62  ions to be disab
1fc90 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c  led.  For normal
1fca0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
1fcb0 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e  n N should be 0.
1fcc0 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68    The idea is th
1fcd0 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61  at a test progra
1fce0 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20  m (like the.    
1fcf0 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73  ** SQL Logic Tes
1fd00 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f  t or SLT test mo
1fd10 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68  dule) can run th
1fd20 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69  e same SQL multi
1fd30 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a  ple times.    **
1fd40 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70   with various op
1fd50 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61  timizations disa
1fd60 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  bled to verify t
1fd70 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73  hat the same ans
1fd80 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62  wer.    ** is ob
1fd90 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20  tained in every 
1fda0 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
1fdb0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1fdc0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
1fdd0 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ONS: {.      sql
1fde0 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1fdf0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1fe00 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74  .      db->dbOpt
1fe10 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61  Flags = (u16)(va
1fe20 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20  _arg(ap, int) & 
1fe30 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62  0xffff);.      b
1fe40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1fe50 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1fe60 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1fe70 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
1fe80 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20  TIME_FAULT, int 
1fe90 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20  onoff);.    **. 
1fea0 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74     ** If paramet
1feb0 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d  er onoff is non-
1fec0 7a 65 72 6f 2c 20 73 75 62 73 65 71 75 65 6e 74  zero, subsequent
1fed0 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74   calls to localt
1fee0 69 6d 65 28 29 0a 20 20 20 20 2a 2a 20 61 6e 64  ime().    ** and
1fef0 20 69 74 73 20 76 61 72 69 61 6e 74 73 20 66 61   its variants fa
1ff00 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
1ff10 7a 65 72 6f 2c 20 75 6e 64 6f 20 74 68 69 73 20  zero, undo this 
1ff20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1ff30 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ff40 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1ff50 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
1ff60 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1ff70 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65  onfig.bLocaltime
1ff80 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61  Fault = va_arg(a
1ff90 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1ffa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ffb0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1ffc0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ffd0 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54 45 52  E_TESTCTRL_INTER
1ffe0 4e 41 4c 5f 46 55 4e 43 53 2c 20 69 6e 74 20 6f  NAL_FUNCS, int o
1fff0 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  noff);.    **.  
20000 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65    ** If paramete
20010 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a  r onoff is non-z
20020 65 72 6f 2c 20 69 6e 74 65 72 6e 61 6c 2d 75 73  ero, internal-us
20030 65 2d 6f 6e 6c 79 20 53 51 4c 20 66 75 6e 63 74  e-only SQL funct
20040 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 61 72 65 20  ions.    ** are 
20050 76 69 73 69 62 6c 65 20 74 6f 20 6f 72 64 69 6e  visible to ordin
20060 61 72 79 20 53 51 4c 2e 20 20 54 68 69 73 20 69  ary SQL.  This i
20070 73 20 75 73 65 66 75 6c 20 66 6f 72 20 74 65 73  s useful for tes
20080 74 69 6e 67 20 62 75 74 20 69 73 0a 20 20 20 20  ting but is.    
20090 2a 2a 20 75 6e 73 61 66 65 20 62 65 63 61 75 73  ** unsafe becaus
200a0 65 20 69 6e 76 61 6c 69 64 20 70 61 72 61 6d 65  e invalid parame
200b0 74 65 72 73 20 74 6f 20 74 68 6f 73 65 20 69 6e  ters to those in
200c0 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20  ternal-use-only 
200d0 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a  functions.    **
200e0 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 63   can result in c
200f0 72 61 73 68 65 73 20 6f 72 20 73 65 67 66 61 75  rashes or segfau
20100 6c 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lts..    */.    
20110 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
20120 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55  CTRL_INTERNAL_FU
20130 4e 43 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  NCTIONS: {.     
20140 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20150 6e 66 69 67 2e 62 49 6e 74 65 72 6e 61 6c 46 75  nfig.bInternalFu
20160 6e 63 74 69 6f 6e 73 20 3d 20 76 61 5f 61 72 67  nctions = va_arg
20170 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
20180 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20190 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
201a0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
201b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
201c0 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29  ER_CORRUPT, int)
201d0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
201e0 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66  Set or clear a f
201f0 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74  lag that indicat
20200 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61  es that the data
20210 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77  base file is alw
20220 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a  ays well-.    **
20230 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65   formed and neve
20240 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73  r corrupt.  This
20250 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62   flag is clear b
20260 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63  y default, indic
20270 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  ating that.    *
20280 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  * database files
20290 20 6d 69 67 68 74 20 68 61 76 65 20 61 72 62 69   might have arbi
202a0 74 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e  trary corruption
202b0 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 66  .  Setting the f
202c0 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a  lag during.    *
202d0 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73 65 73  * testing causes
202e0 20 63 65 72 74 61 69 6e 20 61 73 73 65 72 74 28   certain assert(
202f0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
20300 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61  the code to be a
20310 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20  ctivated.    ** 
20320 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20  that demonstrat 
20330 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65  invariants on we
20340 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
20350 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f  se files..    */
20360 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20370 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
20380 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20  CORRUPT: {.     
20390 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
203a0 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70  nfig.neverCorrup
203b0 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
203c0 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
203d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
203e0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
203f0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
20400 53 54 43 54 52 4c 5f 45 58 54 52 41 5f 53 43 48  STCTRL_EXTRA_SCH
20410 45 4d 41 5f 43 48 45 43 4b 53 2c 20 69 6e 74 29  EMA_CHECKS, int)
20420 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
20430 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66  Set or clear a f
20440 6c 61 67 20 74 68 61 74 20 63 61 75 73 65 73 20  lag that causes 
20450 53 51 4c 69 74 65 20 74 6f 20 76 65 72 69 66 79  SQLite to verify
20460 20 74 68 61 74 20 74 79 70 65 2c 20 6e 61 6d 65   that type, name
20470 2c 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 62 6c  ,.    ** and tbl
20480 5f 6e 61 6d 65 20 66 69 65 6c 64 73 20 6f 66 20  _name fields of 
20490 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
204a0 72 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  r table.  This i
204b0 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 20 20 2a  s normally.    *
204c0 2a 20 6f 6e 2c 20 62 75 74 20 69 74 20 69 73 20  * on, but it is 
204d0 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 66 75 6c  sometimes useful
204e0 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20   to turn it off 
204f0 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 20 20 20  for testing..   
20500 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
20510 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 54  ITE_TESTCTRL_EXT
20520 52 41 5f 53 43 48 45 4d 41 5f 43 48 45 43 4b 53  RA_SCHEMA_CHECKS
20530 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
20540 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 45  3GlobalConfig.bE
20550 78 74 72 61 53 63 68 65 6d 61 43 68 65 63 6b 73  xtraSchemaChecks
20560 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
20570 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
20580 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
20590 65 74 20 74 68 65 20 74 68 72 65 73 68 6f 6c 64  et the threshold
205a0 20 61 74 20 77 68 69 63 68 20 4f 50 5f 4f 6e 63   at which OP_Onc
205b0 65 20 63 6f 75 6e 74 65 72 73 20 72 65 73 65 74  e counters reset
205c0 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f 2e 0a 20   back to zero.. 
205d0 20 20 20 2a 2a 20 42 79 20 64 65 66 61 75 6c 74     ** By default
205e0 20 74 68 69 73 20 69 73 20 30 78 37 66 66 66 66   this is 0x7ffff
205f0 66 66 65 20 28 6f 76 65 72 20 32 20 62 69 6c 6c  ffe (over 2 bill
20600 69 6f 6e 29 2c 20 62 75 74 20 74 68 61 74 20 76  ion), but that v
20610 61 6c 75 65 20 69 73 0a 20 20 20 20 2a 2a 20 74  alue is.    ** t
20620 6f 6f 20 62 69 67 20 74 6f 20 74 65 73 74 20 69  oo big to test i
20630 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 61  n a reasonable a
20640 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 2c 20 73  mount of time, s
20650 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f 6c 20 69  o this control i
20660 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76 69 64 65  s.    ** provide
20670 64 20 74 6f 20 73 65 74 20 61 20 73 6d 61 6c 6c  d to set a small
20680 20 61 6e 64 20 65 61 73 69 6c 79 20 72 65 61 63   and easily reac
20690 68 61 62 6c 65 20 72 65 73 65 74 20 76 61 6c 75  hable reset valu
206a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
206b0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
206c0 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54 5f 54 48  RL_ONCE_RESET_TH
206d0 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20 20 20 20  RESHOLD: {.     
206e0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
206f0 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73 65 74 54  nfig.iOnceResetT
20700 68 72 65 73 68 6f 6c 64 20 3d 20 76 61 5f 61 72  hreshold = va_ar
20710 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
20720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20730 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
20740 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
20750 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
20760 42 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61  BE_COVERAGE, xCa
20770 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20  llback, ptr);.  
20780 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
20790 74 68 65 20 56 44 42 45 20 63 6f 76 65 72 61 67  the VDBE coverag
207a0 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
207b0 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  ion to xCallback
207c0 20 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20   with context . 
207d0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74     ** pointer pt
207e0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
207f0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
20800 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  RL_VDBE_COVERAGE
20810 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
20820 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
20830 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
20840 69 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c  id (*branch_call
20850 62 61 63 6b 29 28 76 6f 69 64 2a 2c 75 6e 73 69  back)(void*,unsi
20860 67 6e 65 64 20 69 6e 74 2c 0a 20 20 20 20 20 20  gned int,.      
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2c 75 6e  unsigned char,un
208a0 73 69 67 6e 65 64 20 63 68 61 72 29 3b 0a 20 20  signed char);.  
208b0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
208c0 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61  lConfig.xVdbeBra
208d0 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  nch = va_arg(ap,
208e0 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
208f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
20900 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
20910 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f  eBranchArg = va_
20920 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23  arg(ap,void*);.#
20930 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
20940 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
20950 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
20960 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
20970 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
20980 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20  MAP, db, nMax); 
20990 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
209a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
209b0 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20  ER_MMAP: {.     
209c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
209d0 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
209e0 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  3*);.      db->n
209f0 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
20a00 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
20a10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20a20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
20a30 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
20a40 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
20a50 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20 20  RL_ISINIT);.    
20a60 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e  **.    ** Return
20a70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51   SQLITE_OK if SQ
20a80 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69 6e  Lite has been in
20a90 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53 51  itialized and SQ
20aa0 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20 20  LITE_ERROR if.  
20ab0 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f    ** not..    */
20ac0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20ad0 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
20ae0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
20af0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20b00 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72 63  g.isInit==0 ) rc
20b10 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
20b20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20b30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
20b40 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
20b50 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
20b60 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20  L_IMPOSTER, db, 
20b70 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74  dbName, onOff, t
20b80 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  num);.    **.   
20b90 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f   ** This test co
20ba0 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74 6f  ntrol is used to
20bb0 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72   create imposter
20bc0 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20 69   tables.  "db" i
20bd0 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  s a pointer.    
20be0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
20bf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  se connection.  
20c00 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64 61  dbName is the da
20c10 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78 3a  tabase name (ex:
20c20 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a   "main" or.    *
20c30 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63 68 20  * "temp") which 
20c40 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68 65  will receive the
20c50 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f   imposter.  "onO
20c60 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73 74  ff" turns impost
20c70 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a  er mode on.    *
20c80 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d  * or off.  "tnum
20c90 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  " is the root pa
20ca0 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
20cb0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6d   to which the im
20cc0 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  poster.    ** ta
20cd0 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65  ble should conne
20ce0 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ct..    **.    *
20cf0 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65  * Enable imposte
20d00 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e  r mode only when
20d10 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
20d20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61 72  already been par
20d30 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a  sed.  Then.    *
20d40 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 43  * run a single C
20d50 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
20d60 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75  ement to constru
20d70 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20  ct the imposter 
20d80 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20  table in.    ** 
20d90 74 68 65 20 70 61 72 73 65 64 20 73 63 68 65 6d  the parsed schem
20da0 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69 6d  a.  Then turn im
20db0 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63 6b  poster mode back
20dc0 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20 20   off again..    
20dd0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f  **.    ** If onO
20de0 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30  ff==0 and tnum>0
20df0 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
20e00 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64  schema for all d
20e10 61 74 61 62 61 73 65 73 2c 20 63 61 75 73 69 6e  atabases, causin
20e20 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  g.    ** the sch
20e30 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72 73  ema to be repars
20e40 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
20e50 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20 20   it is needed.  
20e60 54 68 69 73 20 68 61 73 20 74 68 65 0a 20 20 20  This has the.   
20e70 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65 72   ** effect of er
20e80 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74  asing all impost
20e90 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a  er tables..    *
20ea0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
20eb0 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
20ec0 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
20ed0 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
20ee0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
20ef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
20f00 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
20f10 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62 2d  utex);.      db-
20f20 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c 69  >init.iDb = sqli
20f30 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
20f40 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73  , va_arg(ap,cons
20f50 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
20f60 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
20f70 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74   db->init.impost
20f80 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72 67  erTable = va_arg
20f90 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
20fa0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
20fb0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
20fc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
20fd0 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26  >init.busy==0 &&
20fe0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
20ff0 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  m>0 ){.        s
21000 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
21010 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
21020 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n(db);.      }. 
21030 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
21040 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
21050 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
21060 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66  ;.    }..#if def
21070 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45 29  ined(YYCOVERAGE)
21080 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
21090 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
210a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
210b0 52 53 45 52 5f 43 4f 56 45 52 41 47 45 2c 20 46  RSER_COVERAGE, F
210c0 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20 20 2a 2a  ILE *out).    **
210d0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
210e0 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e 6c 79 20  t control (only 
210f0 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e 20 53  available when S
21100 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
21110 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 2d 44  d with.    ** -D
21120 59 59 43 4f 56 45 52 41 47 45 29 20 77 72 69 74  YYCOVERAGE) writ
21130 65 73 20 61 20 72 65 70 6f 72 74 20 6f 6e 74 6f  es a report onto
21140 20 22 6f 75 74 22 20 74 68 61 74 20 73 68 6f 77   "out" that show
21150 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 61  s all.    ** sta
21160 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20 63 6f 6d  te/lookahead com
21170 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20 74 68 65  binations in the
21180 20 70 61 72 73 65 72 20 73 74 61 74 65 20 6d 61   parser state ma
21190 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20 77 68 69  chine.    ** whi
211a0 63 68 20 61 72 65 20 6e 65 76 65 72 20 65 78 65  ch are never exe
211b0 72 63 69 73 65 64 2e 20 20 49 66 20 61 6e 79 20  rcised.  If any 
211c0 73 74 61 74 65 20 69 73 20 6d 69 73 73 65 64 2c  state is missed,
211d0 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a   make the.    **
211e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53 51 4c   return code SQL
211f0 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 20 20 2a  ITE_ERROR..    *
21200 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
21210 45 5f 54 45 53 54 43 54 52 4c 5f 50 41 52 53 45  E_TESTCTRL_PARSE
21220 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 20 20  R_COVERAGE: {.  
21230 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
21240 76 61 5f 61 72 67 28 61 70 2c 20 46 49 4c 45 2a  va_arg(ap, FILE*
21250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
21260 69 74 65 33 50 61 72 73 65 72 43 6f 76 65 72 61  ite3ParserCovera
21270 67 65 28 6f 75 74 29 20 29 20 72 63 20 3d 20 53  ge(out) ) rc = S
21280 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
21290 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
212a0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
212b0 64 28 59 59 43 4f 56 45 52 41 47 45 29 20 2a 2f  d(YYCOVERAGE) */
212c0 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
212d0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
212e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
212f0 45 53 55 4c 54 5f 49 4e 54 52 45 41 4c 2c 20 73  ESULT_INTREAL, s
21300 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
21310 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
21320 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f  This test-contro
21330 6c 20 63 61 75 73 65 73 20 74 68 65 20 6d 6f 73  l causes the mos
21340 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
21350 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 29 20  _result_int64() 
21360 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20  value.    ** to 
21370 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  be interpreted a
21380 73 20 61 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20  s a MEM_IntReal 
21390 69 6e 73 74 65 61 64 20 6f 66 20 61 73 20 61 6e  instead of as an
213a0 20 4d 45 4d 5f 49 6e 74 2e 20 20 4e 6f 72 6d 61   MEM_Int.  Norma
213b0 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20 4d 45 4d 5f  lly,.    ** MEM_
213c0 49 6e 74 52 65 61 6c 20 76 61 6c 75 65 73 20 6f  IntReal values o
213d0 6e 6c 79 20 61 72 69 73 65 20 64 75 72 69 6e 67  nly arise during
213e0 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61   an INSERT opera
213f0 74 69 6f 6e 20 6f 66 20 69 6e 74 65 67 65 72 0a  tion of integer.
21400 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 69 6e      ** values in
21410 74 6f 20 61 20 52 45 41 4c 20 63 6f 6c 75 6d 6e  to a REAL column
21420 2c 20 73 6f 20 74 68 65 79 20 63 61 6e 20 62 65  , so they can be
21430 20 63 68 61 6c 6c 65 6e 67 69 6e 67 20 74 6f 20   challenging to 
21440 74 65 73 74 2e 20 20 54 68 69 73 0a 20 20 20 20  test.  This.    
21450 2a 2a 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 20  ** test-control 
21460 65 6e 61 62 6c 65 73 20 75 73 20 74 6f 20 77 72  enables us to wr
21470 69 74 65 20 61 6e 20 69 6e 74 72 65 61 6c 28 29  ite an intreal()
21480 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68   SQL function th
21490 61 74 20 63 61 6e 0a 20 20 20 20 2a 2a 20 69 6e  at can.    ** in
214a0 6a 65 63 74 20 61 6e 20 69 6e 74 72 65 61 6c 28  ject an intreal(
214b0 29 20 76 61 6c 75 65 20 61 74 20 61 72 62 69 74  ) value at arbit
214c0 72 61 72 79 20 70 6c 61 63 65 73 20 69 6e 20 61  rary places in a
214d0 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c  n SQL statement,
214e0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 65 73 74  .    ** for test
214f0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20 20  ing purposes..  
21500 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
21510 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
21520 53 55 4c 54 5f 49 4e 54 52 45 41 4c 3a 20 7b 0a  SULT_INTREAL: {.
21530 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
21540 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 76 61  ntext *pCtx = va
21550 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
21560 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 20 20  _context*);.    
21570 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 49    sqlite3ResultI
21580 6e 74 52 65 61 6c 28 70 43 74 78 29 3b 0a 20 20  ntReal(pCtx);.  
21590 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
215a0 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
215b0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
215c0 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 20 2a  ITE_UNTESTABLE *
215d0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
215e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
215f0 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e  a utility routin
21600 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53  e, useful to VFS
21610 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
21620 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a  , that checks.**
21630 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74   to see if a dat
21640 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61  abase file was a
21650 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69   URI that contai
21660 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71  ned a specific q
21670 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74  uery .** paramet
21680 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62  er, and if so ob
21690 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
216a0 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72  of the query par
216b0 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
216c0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
216d0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65  ment is the file
216e0 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73  name pointer pas
216f0 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70  sed into the xOp
21700 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  en().** method o
21710 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  f a VFS implemen
21720 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61  tation.  The zPa
21730 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ram argument is 
21740 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
21750 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
21760 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69  er we seek.  Thi
21770 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
21780 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
21790 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72  he zParam.** par
217a0 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69  ameter if it exi
217b0 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72  sts.  If the par
217c0 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20  ameter does not 
217d0 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  exist, this rout
217e0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ine.** returns a
217f0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
21800 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
21810 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
21820 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
21830 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
21840 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a   char *zParam){.
21850 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
21860 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20  =0 || zParam==0 
21870 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46  ) return 0;.  zF
21880 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
21890 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
218a0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69  name) + 1;.  whi
218b0 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  le( zFilename[0]
218c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20   ){.    int x = 
218d0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
218e0 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a  , zParam);.    z
218f0 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
21900 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
21910 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  ename) + 1;.    
21920 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72  if( x==0 ) retur
21930 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  n zFilename;.   
21940 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
21950 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
21960 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
21970 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
21980 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21990 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f  boolean value fo
219a0 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
219b0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
219c0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
219d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
219e0 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
219f0 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62  r *zParam, int b
21a00 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Dflt){.  const c
21a10 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
21a20 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
21a30 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
21a40 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66  );.  bDflt = bDf
21a50 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  lt!=0;.  return 
21a60 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f  z ? sqlite3GetBo
21a70 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20  olean(z, bDflt) 
21a80 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  : bDflt;.}../*.*
21a90 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69  * Return a 64-bi
21aa0 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
21ab0 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
21ac0 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  meter..*/.sqlite
21ad0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
21ae0 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e  uri_int64(.  con
21af0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
21b00 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me,    /* Filena
21b10 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  me as passed to 
21b20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  xOpen */.  const
21b30 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20   char *zParam,  
21b40 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61       /* URI para
21b50 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a  meter sought */.
21b60 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
21b70 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72  bDflt       /* r
21b80 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74  eturn if paramet
21b90 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f  er is missing */
21ba0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
21bb0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
21bc0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
21bd0 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
21be0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
21bf0 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71  v;.  if( z && sq
21c00 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
21c10 36 34 28 7a 2c 20 26 76 29 3d 3d 30 20 29 7b 0a  64(z, &v)==0 ){.
21c20 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20      bDflt = v;. 
21c30 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c   }.  return bDfl
21c40 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
21c50 72 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69  rn the Btree poi
21c60 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20  nter identified 
21c70 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74  by zDbName.  Ret
21c80 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
21c90 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20  found..*/.Btree 
21ca0 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f  *sqlite3DbNameTo
21cb0 42 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  Btree(sqlite3 *d
21cc0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
21cd0 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  DbName){.  int i
21ce0 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20 3f 20 73  Db = zDbName ? s
21cf0 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
21d00 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 20 3a 20  (db, zDbName) : 
21d10 30 3b 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3c  0;.  return iDb<
21d20 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61 44 62 5b  0 ? 0 : db->aDb[
21d30 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a 2f 2a 0a  iDb].pBt;.}../*.
21d40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
21d50 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  lename of the da
21d60 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
21d70 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
21d80 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
21d90 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
21da0 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
21db0 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
21dc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
21dd0 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
21de0 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  pBt;.#ifdef SQLI
21df0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
21e00 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
21e10 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
21e20 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
21e30 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
21e40 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
21e50 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
21e60 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
21e70 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
21e80 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
21e90 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
21ea0 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
21eb0 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  pBt) : 0;.}../*.
21ec0 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64  ** Return 1 if d
21ed0 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
21ee0 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61  only or 0 if rea
21ef0 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e  d/write.  Return
21f00 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63   -1 if.** no suc
21f10 68 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  h database exist
21f20 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
21f30 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71  3_db_readonly(sq
21f40 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
21f50 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
21f60 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23  .  Btree *pBt;.#
21f70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
21f80 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
21f90 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
21fa0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
21fb0 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
21fc0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
21fd0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
21fe0 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d  }.#endif.  pBt =
21ff0 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
22000 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
22010 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  e);.  return pBt
22020 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   ? sqlite3BtreeI
22030 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a  sReadonly(pBt) :
22040 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   -1;.}..#ifdef S
22050 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
22060 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  PSHOT./*.** Obta
22070 69 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61  in a snapshot ha
22080 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61  ndle for the sna
22090 70 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73  pshot of databas
220a0 65 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20  e zDb currently 
220b0 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62  .** being read b
220c0 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  y handle db..*/.
220d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  int sqlite3_snap
220e0 73 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69  shot_get(.  sqli
220f0 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73  te3 *db, .  cons
22100 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73  t char *zDb,.  s
22110 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
22120 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a  **ppSnapshot.){.
22130 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22140 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66  E_ERROR;.#ifndef
22150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
22160 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22170 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
22180 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
22190 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
221a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
221b0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
221c0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
221d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
221e0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
221f0 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
22200 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
22210 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
22220 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
22230 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44  zDb);.    if( iD
22240 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
22250 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
22260 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
22270 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
22280 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49  0==sqlite3BtreeI
22290 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
222a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
222b0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
222c0 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  rans(pBt, 0, 0);
222d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
222e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
222f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22300 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
22310 74 47 65 74 28 73 71 6c 69 74 65 33 42 74 72 65  tGet(sqlite3Btre
22320 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 70 53  ePager(pBt), ppS
22330 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
22340 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22350 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
22360 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
22370 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
22380 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
22390 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
223a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
223b0 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
223c0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e 61  ction on the sna
223d0 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65 64  pshot idendified
223e0 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a 2a   by pSnapshot..*
223f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
22400 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 73  apshot_open(.  s
22410 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
22420 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
22430 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
22440 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a 29  hot *pSnapshot.)
22450 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22460 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64  ITE_ERROR;.#ifnd
22470 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
22480 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  AL..#ifdef SQLIT
22490 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
224a0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
224b0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
224c0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
224d0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
224e0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
224f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22500 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
22510 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  ;.  if( db->auto
22520 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
22530 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69 44   int iDb;.    iD
22540 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
22550 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
22560 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c      if( iDb==0 |
22570 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20  | iDb>1 ){.     
22580 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
22590 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
225a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
225b0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
225c0 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pBt)==0 ){.     
225d0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
225e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
225f0 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
22600 20 20 20 69 6e 74 20 62 55 6e 6c 6f 63 6b 20 3d     int bUnlock =
22610 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
22620 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
22630 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29  ReadTrans(pBt) )
22640 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
22650 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3d  db->nVdbeActive=
22660 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22680 67 65 72 53 6e 61 70 73 68 6f 74 43 68 65 63 6b  gerSnapshotCheck
22690 28 70 50 61 67 65 72 2c 20 70 53 6e 61 70 73 68  (pPager, pSnapsh
226a0 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ot);.           
226b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
226c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
226d0 20 20 20 20 62 55 6e 6c 6f 63 6b 20 3d 20 31 3b      bUnlock = 1;
226e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
226f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22700 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
22710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22730 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22740 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22790 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 70  erSnapshotOpen(p
227a0 50 61 67 65 72 2c 20 70 53 6e 61 70 73 68 6f 74  Pager, pSnapshot
227b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
227c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
227d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
227e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
227f0 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
22800 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
22810 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
22820 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 70  erSnapshotOpen(p
22830 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
22840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
22850 20 62 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20   bUnlock ){.    
22860 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
22870 65 72 53 6e 61 70 73 68 6f 74 55 6e 6c 6f 63 6b  erSnapshotUnlock
22880 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
22890 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
228a0 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
228b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
228c0 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
228d0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
228e0 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
228f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
22900 63 6f 76 65 72 20 61 73 20 6d 61 6e 79 20 73 6e  cover as many sn
22910 61 70 73 68 6f 74 73 20 61 73 20 70 6f 73 73 69  apshots as possi
22920 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 77 61 6c  ble from the wal
22930 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
22940 20 77 69 74 68 0a 2a 2a 20 73 63 68 65 6d 61 20   with.** schema 
22950 7a 44 62 20 6f 66 20 64 61 74 61 62 61 73 65 20  zDb of database 
22960 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
22970 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f  e3_snapshot_reco
22980 76 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ver(sqlite3 *db,
22990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
229a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
229b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e  LITE_ERROR;.  in
229c0 74 20 69 44 62 3b 0a 23 69 66 6e 64 65 66 20 53  t iDb;.#ifndef S
229d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
229e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
229f0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
22a00 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
22a10 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
22a20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
22a30 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
22a40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
22a50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
22a60 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
22a70 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
22a80 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
22a90 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20  );.  if( iDb==0 
22aa0 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  || iDb>1 ){.    
22ab0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
22ac0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
22ad0 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
22ae0 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
22af0 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
22b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22b10 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
22b20 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
22b30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22b40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
22b50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
22b60 61 70 73 68 6f 74 52 65 63 6f 76 65 72 28 73 71  apshotRecover(sq
22b70 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
22b80 70 42 74 29 29 3b 0a 20 20 20 20 20 20 20 20 73  pBt));.        s
22b90 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
22ba0 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  t(pBt);.      }.
22bb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
22bc0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22bd0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
22be0 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
22bf0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
22c00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22c10 20 46 72 65 65 20 61 20 73 6e 61 70 73 68 6f 74   Free a snapshot
22c20 20 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64   handle obtained
22c30 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e   from sqlite3_sn
22c40 61 70 73 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f  apshot_get()..*/
22c50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 6e  .void sqlite3_sn
22c60 61 70 73 68 6f 74 5f 66 72 65 65 28 73 71 6c 69  apshot_free(sqli
22c70 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53  te3_snapshot *pS
22c80 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69  napshot){.  sqli
22c90 74 65 33 5f 66 72 65 65 28 70 53 6e 61 70 73 68  te3_free(pSnapsh
22ca0 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ot);.}.#endif /*
22cb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
22cc0 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 6e  NAPSHOT */..#ifn
22cd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22ce0 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
22cf0 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  AGS./*.** Given 
22d00 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
22d10 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
22d20 6e 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  n, return true i
22d30 66 20 74 68 61 74 20 6f 70 74 69 6f 6e 0a 2a 2a  f that option.**
22d40 20 77 61 73 20 75 73 65 64 20 61 6e 64 20 66 61   was used and fa
22d50 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  lse if not..**.*
22d60 2a 20 54 68 65 20 6e 61 6d 65 20 63 61 6e 20 6f  * The name can o
22d70 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69 6e 20  ptionally begin 
22d80 77 69 74 68 20 22 53 51 4c 49 54 45 5f 22 20 62  with "SQLITE_" b
22d90 75 74 20 74 68 65 20 22 53 51 4c 49 54 45 5f 22  ut the "SQLITE_"
22da0 20 70 72 65 66 69 78 0a 2a 2a 20 69 73 20 6e 6f   prefix.** is no
22db0 74 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  t required for a
22dc0 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73   match..*/.int s
22dd0 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
22de0 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e 73 74 20  tion_used(const 
22df0 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 29 7b  char *zOptName){
22e00 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
22e10 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74  nt nOpt;.  const
22e20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c   char **azCompil
22e30 65 4f 70 74 3b 0a 20 0a 23 69 66 20 53 51 4c 49  eOpt;. .#if SQLI
22e40 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
22e50 4d 4f 52 0a 20 20 69 66 28 20 7a 4f 70 74 4e 61  MOR.  if( zOptNa
22e60 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 28 76 6f  me==0 ){.    (vo
22e70 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
22e80 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
22e90 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
22ea0 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 20  .  azCompileOpt 
22eb0 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c 65  = sqlite3Compile
22ec0 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a  Options(&nOpt);.
22ed0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
22ee0 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c  rNICmp(zOptName,
22ef0 20 22 53 51 4c 49 54 45 5f 22 2c 20 37 29 3d 3d   "SQLITE_", 7)==
22f00 30 20 29 20 7a 4f 70 74 4e 61 6d 65 20 2b 3d 20  0 ) zOptName += 
22f10 37 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  7;.  n = sqlite3
22f20 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 4e 61 6d  Strlen30(zOptNam
22f30 65 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20  e);..  /* Since 
22f40 6e 4f 70 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  nOpt is normally
22f50 20 69 6e 20 73 69 6e 67 6c 65 20 64 69 67 69 74   in single digit
22f60 73 2c 20 61 20 6c 69 6e 65 61 72 20 73 65 61 72  s, a linear sear
22f70 63 68 20 69 73 20 0a 20 20 2a 2a 20 61 64 65 71  ch is .  ** adeq
22f80 75 61 74 65 2e 20 4e 6f 20 6e 65 65 64 20 66 6f  uate. No need fo
22f90 72 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  r a binary searc
22fa0 68 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  h. */.  for(i=0;
22fb0 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b 29 7b 0a 20   i<nOpt; i++){. 
22fc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
22fd0 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c  rNICmp(zOptName,
22fe0 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d   azCompileOpt[i]
22ff0 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  , n)==0.     && 
23000 73 71 6c 69 74 65 33 49 73 49 64 43 68 61 72 28  sqlite3IsIdChar(
23010 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 61  (unsigned char)a
23020 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 5b 6e  zCompileOpt[i][n
23030 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ])==0.    ){.   
23040 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
23050 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23060 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
23070 72 6e 20 74 68 65 20 4e 2d 74 68 20 63 6f 6d 70  rn the N-th comp
23080 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
23090 73 74 72 69 6e 67 2e 20 20 49 66 20 4e 20 69 73  string.  If N is
230a0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 0a 2a   out of range,.*
230b0 2a 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20  * return a NULL 
230c0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
230d0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
230e0 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
230f0 74 28 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20  t(int N){.  int 
23100 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nOpt;.  const ch
23110 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70  ar **azCompileOp
23120 74 3b 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70  t;.  azCompileOp
23130 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69  t = sqlite3Compi
23140 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29  leOptions(&nOpt)
23150 3b 0a 20 20 69 66 28 20 4e 3e 3d 30 20 26 26 20  ;.  if( N>=0 && 
23160 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20 20 20 72 65  N<nOpt ){.    re
23170 74 75 72 6e 20 61 7a 43 6f 6d 70 69 6c 65 4f 70  turn azCompileOp
23180 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t[N];.  }.  retu
23190 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
231a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
231b0 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
231c0 53 20 2a 2f 0a                                   S */.