/ Hex Artifact Content
Login

Artifact 54637b9e7f91de6d281e577cd1a997762a4613f51a0509790027ca9865185d7c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20  LE_STMTVTAB.int 
0380: 73 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49  sqlite3StmtVtabI
0390: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23  nit(sqlite3*);.#
03a0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
03b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a  ITE_ENABLE_FTS5.
03c0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
03d0: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23  nit(sqlite3*);.#
03e0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
03f0: 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49  QLITE_AMALGAMATI
0400: 4f 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  ON./* IMPLEMENTA
0410: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36  TION-OF: R-46656
0420: 2d 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74  -45156 The sqlit
0430: 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72  e3_version[] str
0440: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  ing constant.** 
0450: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78  contains the tex
0460: 74 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53  t of SQLITE_VERS
0470: 49 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63  ION macro. .*/.c
0480: 6f 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65  onst char sqlite
0490: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51  3_version[] = SQ
04a0: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65  LITE_VERSION;.#e
04b0: 6e 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  ndif../* IMPLEME
04c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33  NTATION-OF: R-53
04d0: 35 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71  536-42575 The sq
04e0: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
04f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0500: 72 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  rns.** a pointer
0510: 20 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73   to the to the s
0520: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d  qlite3_version[]
0530: 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74   string constant
0540: 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  . .*/.const char
0550: 20 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72   *sqlite3_libver
0560: 73 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75  sion(void){ retu
0570: 72 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rn sqlite3_versi
0580: 6f 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d  on; }../* IMPLEM
0590: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32  ENTATION-OF: R-2
05a0: 35 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73  5063-23286 The s
05b0: 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
05c0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
05d0: 6e 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  ns a.** pointer 
05e0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73  to a string cons
05f0: 74 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65  tant whose value
0600: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
0610: 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f  the.** SQLITE_SO
0620: 55 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f  URCE_ID C prepro
0630: 63 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78  cessor macro. Ex
0640: 63 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69  cept if SQLite i
0650: 73 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a  s built using.**
0660: 20 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20   an edited copy 
0670: 6f 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  of the amalgamat
0680: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  ion, then the la
0690: 73 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65  st four characte
06a0: 72 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73  rs of.** the has
06b0: 68 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65  h might be diffe
06c0: 72 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  rent from SQLITE
06d0: 5f 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63  _SOURCE_ID..*/.c
06e0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
06f0: 65 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64  e3_sourceid(void
0700: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0710: 5f 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f  _SOURCE_ID; }../
0720: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0730: 2d 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35  -OF: R-35210-635
0740: 30 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c  08 The sqlite3_l
0750: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
0760: 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  () function.** r
0770: 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65  eturns an intege
0780: 72 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54  r equal to SQLIT
0790: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
07a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
07b0: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
07c0: 65 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e  er(void){ return
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 3b 20 7d 0a 0a 2f 2a 20 49 4d  NUMBER; }../* IM
07f0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
0800: 20 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54   R-20790-14025 T
0810: 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
0820: 64 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e  dsafe() function
0830: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f   returns.** zero
0840: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
0850: 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69  SQLite was compi
0860: 6c 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e  led with mutexin
0870: 67 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64  g code omitted d
0880: 75 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c  ue to.** the SQL
0890: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63  ITE_THREADSAFE c
08a0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
08b0: 6f 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  on being set to 
08c0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
08d0: 33 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69  3_threadsafe(voi
08e0: 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d){ return SQLIT
08f0: 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a  E_THREADSAFE; }.
0900: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  ./*.** When comp
0910: 69 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66  iling the test f
0920: 69 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64  ixture or with d
0930: 65 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64  ebugging enabled
0940: 20 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20   (on Win32),.** 
0950: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65  this variable be
0960: 69 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a  ing set to non-z
0970: 65 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f  ero will cause O
0980: 53 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f  STRACE macros to
0990: 20 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64   emit.** extra d
09a0: 69 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d  iagnostic inform
09b0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66  ation..*/.#ifdef
09c0: 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f   SQLITE_HAVE_OS_
09d0: 54 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53  TRACE.# ifndef S
09e0: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
09f0: 52 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20  RACE.#   define 
0a00: 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f  SQLITE_DEBUG_OS_
0a10: 54 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a  TRACE 0.# endif.
0a20: 20 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54    int sqlite3OST
0a30: 72 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  race = SQLITE_DE
0a40: 42 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65  BUG_OS_TRACE;.#e
0a50: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
0a60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
0a70: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
0a80: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
0a90: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66  OTRACE)./*.** If
0aa0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
0ab0: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
0ac0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
0ad0: 69 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if.** SQLITE_ENA
0ae0: 42 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65  BLE_IOTRACE is e
0af0: 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73  nabled, then mes
0b00: 73 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67  sages describing
0b10: 0a 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61  .** I/O active a
0b20: 72 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67  re written using
0b30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
0b40: 20 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a   These messages.
0b50: 2a 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20  ** are intended 
0b60: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63  for debugging ac
0b70: 74 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a  tivity only..*/.
0b80: 53 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20  SQLITE_API void 
0b90: 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73  (SQLITE_CDECL *s
0ba0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63  qlite3IoTrace)(c
0bb0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29  onst char*, ...)
0bc0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
0bd0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0be0: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0bf0: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0c00: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0c10: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0c20: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0c30: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0c40: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0c50: 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72   store.** tempor
0c60: 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ary files..**.**
0c70: 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50   See also the "P
0c80: 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
0c90: 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20  _directory" SQL 
0ca0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72  command..*/.char
0cb0: 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   *sqlite3_temp_d
0cc0: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f  irectory = 0;../
0cd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c  *.** If the foll
0ce0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
0cf0: 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  iable points to 
0d00: 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69  a string which i
0d10: 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  s the.** name of
0d20: 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68   a directory, th
0d30: 65 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  en that director
0d40: 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  y will be used t
0d50: 6f 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64  o store.** all d
0d60: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70  atabase files sp
0d70: 65 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72  ecified with a r
0d80: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
0d90: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
0da0: 20 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74   the "PRAGMA dat
0db0: 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
0dc0: 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a  y" SQL command..
0dd0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
0de0: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
0df0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  = 0;../*.** Init
0e00: 69 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20  ialize SQLite.  
0e10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0e20: 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
0e30: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
0e40: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0e50: 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20  cation,.** VFS, 
0e60: 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
0e70: 74 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f  tems prior to do
0e80: 69 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20  ing any serious 
0e90: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c  work with.** SQL
0ea0: 69 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e  ite.  But as lon
0eb0: 67 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20  g as you do not 
0ec0: 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c  compile with SQL
0ed0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
0ee0: 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  T.** this routin
0ef0: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
0f00: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
0f10: 79 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73  y key routines s
0f20: 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65  uch as.** sqlite
0f30: 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a  3_open().  .**.*
0f40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0f50: 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74  s a no-op except
0f60: 20 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72   on its very fir
0f70: 73 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20  st call for the 
0f80: 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66  process,.** or f
0f90: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  or the first cal
0fa0: 6c 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  l after a call t
0fb0: 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  o sqlite3_shutdo
0fc0: 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  wn..**.** The fi
0fd0: 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61  rst thread to ca
0fe0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
0ff0: 72 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c  runs the initial
1000: 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f  ization to.** co
1010: 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75  mpletion.  If su
1020: 62 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73  bsequent threads
1030: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
1040: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ne before the fi
1050: 72 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61  rst.** thread ha
1060: 73 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69  s finished the i
1070: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
1080: 6f 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20  ocess, then the 
1090: 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68  subsequent.** th
10a0: 72 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b  reads must block
10b0: 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
10c0: 20 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73   thread finishes
10d0: 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
10e0: 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  lization..**.** 
10f0: 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  The first thread
1100: 20 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73   might call this
1110: 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69   routine recursi
1120: 76 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65  vely.  Recursive
1130: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  .** calls to thi
1140: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1150: 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63   not block, of c
1160: 6f 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73  ourse.  Otherwis
1170: 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
1180: 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20  ization process 
1190: 77 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70  would never comp
11a0: 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20  lete..**.** Let 
11b0: 58 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74  X be the first t
11c0: 68 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74  hread to enter t
11d0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65  his routine.  Le
11e0: 74 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65  t Y be some othe
11f0: 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68  r.** thread.  Th
1200: 65 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69  en while the ini
1210: 74 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tial invocation 
1220: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
1230: 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d  by X is.** incom
1240: 70 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71  plete, it is req
1250: 75 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a  uired that:.**.*
1260: 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f  *    *  Calls to
1270: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1280: 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20  om Y must block 
1290: 75 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d  until the outer-
12a0: 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61  most.**       ca
12b0: 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65  ll by X complete
12c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52  s..**.**    *  R
12d0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
12e0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  o this routine f
12f0: 72 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74  rom thread X ret
1300: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
1310: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74  **       without
1320: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e   blocking..*/.in
1330: 74 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  t sqlite3_initia
1340: 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55  lize(void){.  MU
1350: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
1360: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
1370: 72 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68  r; )       /* Th
1380: 65 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75  e main static mu
1390: 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  tex */.  int rc;
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
13d0: 63 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  code */.#ifdef S
13e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
13f0: 0a 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61  .  int bRunExtra
1400: 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Init = 0;       
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 2f 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c  /* Extra initial
1430: 69 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a  ization needed *
1440: 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  /.#endif..#ifdef
1450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
1460: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1470: 77 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32  wsd_init(4096, 2
1480: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
1490: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
14b0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
14c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
14d0: 72 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f  rt() fails on so
14e0: 6d 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65  me obscure proce
14f0: 73 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20  ssor/compiler.  
1500: 2a 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20  ** combination, 
1510: 74 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  the work-around 
1520: 69 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f  is to set the co
1530: 72 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20  rrect pointer.  
1540: 2a 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69  ** size at compi
1550: 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44  le-time using -D
1560: 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e  SQLITE_PTRSIZE=n
1570: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1580: 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  tion */.  assert
1590: 28 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45  ( SQLITE_PTRSIZE
15a0: 3d 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  ==sizeof(char*) 
15b0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69  );..  /* If SQLi
15c0: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  te is already co
15d0: 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c  mpletely initial
15e0: 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  ized, then this 
15f0: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  call.  ** to sql
1600: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1610: 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  ) should be a no
1620: 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e  -op.  But the in
1630: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
1640: 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65  * must be comple
1650: 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d  te.  So isInit m
1660: 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75  ust not be set u
1670: 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e  ntil the very en
1680: 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72  d.  ** of this r
1690: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  outine..  */.  i
16a0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
16b0: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20  Config.isInit ) 
16c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16d0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
16e0: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
16f0: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
1700: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
1710: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
1720: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
1730: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
1740: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
1750: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
1760: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
1770: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
1780: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
1790: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
17a0: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
17b0: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
17c0: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
17d0: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
17e0: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
17f0: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
1800: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
1810: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
1820: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
1830: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1840: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
1850: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1860: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
1870: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
1880: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
1890: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
18a0: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
18b0: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
18c0: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
18d0: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
18e0: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
18f0: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
1900: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
1910: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
1920: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
1930: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
1940: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
1950: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
1960: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
1970: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
1980: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
1990: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
19a0: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
19b0: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
19c0: 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  m..  */.  MUTEX_
19d0: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
19e0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
19f0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1a00: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
1a10: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
1a20: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
1a30: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
1a40: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
1a50: 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  nit = 1;.  if( !
1a60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1a70: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1a80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a90: 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29  ite3MallocInit()
1aa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ac0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1ad0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1ae0: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21  t = 1;.    if( !
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
1b10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1b20: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
1b30: 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20  tMutex =.       
1b40: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
1b50: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1b60: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
1b70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1b80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
1b90: 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69  reMutex && !sqli
1ba0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1bb0: 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20  pInitMutex ){.  
1bc0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bd0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1be0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1c10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1c20: 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a  RefInitMutex++;.
1c30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1c40: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
1c50: 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20  r);..  /* If rc 
1c60: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
1c70: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
1c80: 74 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20  then either the 
1c90: 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73  malloc.  ** subs
1ca0: 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20  ystem could not 
1cb0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f  be initialized o
1cc0: 72 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69  r the system fai
1cd0: 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  led to allocate.
1ce0: 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75    ** the pInitMu
1cf0: 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72  tex mutex. Retur
1d00: 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69  n an error in ei
1d10: 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20  ther case.  */. 
1d20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d30: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1d40: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44   rc;.  }..  /* D
1d50: 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  o the rest of th
1d60: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1d70: 20 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72   under the recur
1d80: 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20  sive mutex so.  
1d90: 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ** that we will 
1da0: 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c  be able to handl
1db0: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1dc0: 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  s into.  ** sqli
1dd0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1de0: 2e 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65  .  The recursive
1df0: 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20   calls normally 
1e00: 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a  come through.  *
1e10: 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  * sqlite3_os_ini
1e20: 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f  t() when it invo
1e30: 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  kes sqlite3_vfs_
1e40: 72 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20  register(), but 
1e50: 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72  other.  ** recur
1e60: 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74  sive calls might
1e70: 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c   also be possibl
1e80: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50  e..  **.  ** IMP
1e90: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
1ea0: 52 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51  R-00140-37445 SQ
1eb0: 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  Lite automatical
1ec0: 6c 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61  ly serializes ca
1ed0: 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  lls.  ** to the 
1ee0: 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f  xInit method, so
1ef0: 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f   the xInit metho
1f00: 64 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68  d need not be th
1f10: 72 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20  readsafe..  **. 
1f20: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
1f30: 67 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20  g mutex is what 
1f40: 73 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73  serializes acces
1f50: 73 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20  s to the appdef 
1f60: 70 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a  pcache xInit.  *
1f70: 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  * methods.  The 
1f80: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
1f90: 65 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61  ethods.xInit() a
1fa0: 6c 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69  ll is embedded i
1fb0: 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20  n the.  ** call 
1fc0: 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  to sqlite3Pcache
1fd0: 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20  Initialize()..  
1fe0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1ff0: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
2000: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2010: 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  itMutex);.  if( 
2020: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2030: 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26  fig.isInit==0 &&
2040: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2050: 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d  nfig.inProgress=
2060: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2070: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
2080: 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69  Progress = 1;.#i
2090: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
20a0: 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a  LE_SQLLOG.    {.
20b0: 20 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69        extern voi
20c0: 64 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73  d sqlite3_init_s
20d0: 71 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20  qllog(void);.   
20e0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f     sqlite3_init_
20f0: 73 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a  sqllog();.    }.
2100: 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65  #endif.    memse
2110: 74 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69  t(&sqlite3Builti
2120: 6e 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73  nFunctions, 0, s
2130: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69  izeof(sqlite3Bui
2140: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b  ltinFunctions));
2150: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69  .    sqlite3Regi
2160: 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74  sterBuiltinFunct
2170: 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20  ions();.    if( 
2180: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2190: 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74  fig.isPCacheInit
21a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
21b0: 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  = sqlite3PcacheI
21c0: 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20  nitialize();.   
21d0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
21e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21f0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2200: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
2210: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  it = 1;.      rc
2220: 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74   = sqlite3OsInit
2230: 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ();.    }.    if
2240: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2260: 50 43 61 63 68 65 42 75 66 66 65 72 53 65 74 75  PCacheBufferSetu
2270: 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  p( sqlite3Global
2280: 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a 20  Config.pPage, . 
2290: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50  GlobalConfig.szP
22b0: 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  age, sqlite3Glob
22c0: 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b  alConfig.nPage);
22d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
22e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
22f0: 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  t = 1;.#ifdef SQ
2300: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
2310: 20 20 20 20 20 20 62 52 75 6e 45 78 74 72 61 49        bRunExtraI
2320: 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  nit = 1;.#endif.
2330: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2340: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
2350: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
2360: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
2370: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 47  x_leave(sqlite3G
2380: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2390: 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47  tMutex);..  /* G
23a0: 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65  o back under the
23b0: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e   static mutex an
23c0: 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  d clean up the r
23d0: 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75  ecursive.  ** mu
23e0: 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61  tex to prevent a
23f0: 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a   resource leak..
2400: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
2410: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
2420: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c  er);.  sqlite3Gl
2430: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2440: 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66  nitMutex--;.  if
2450: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2460: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2470: 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73  tex<=0 ){.    as
2480: 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f  sert( sqlite3Glo
2490: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
24a0: 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20  itMutex==0 );.  
24b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
24c0: 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f 62  free(sqlite3Glob
24d0: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
24e0: 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tex);.    sqlite
24f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2500: 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20  nitMutex = 0;.  
2510: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
2520: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
2530: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
2540: 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61 20  owing is just a 
2550: 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20  sanity check to 
2560: 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65  make sure SQLite
2570: 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63   has.  ** been c
2580: 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74 6c  ompiled correctl
2590: 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74  y.  It is import
25a0: 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73 20  ant to run this 
25b0: 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77  code, but.  ** w
25c0: 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
25d0: 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e  run it too often
25e0: 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50 55   and soak up CPU
25f0: 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20   cycles for no. 
2600: 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20   ** reason.  So 
2610: 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20 64  we run it once d
2620: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
2630: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tion..  */.#ifnd
2640: 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64 65  ef NDEBUG.#ifnde
2650: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
2660: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f  OATING_POINT.  /
2670: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 6f  * This section o
2680: 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f  f code's only "o
2690: 75 74 70 75 74 22 20 69 73 20 76 69 61 20 61 73  utput" is via as
26a0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
26b0: 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d  s. */.  if ( rc=
26c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26d0: 20 20 75 36 34 20 78 20 3d 20 28 28 28 75 36 34    u64 x = (((u64
26e0: 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20  )1)<<63)-1;.    
26f0: 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61 73  double y;.    as
2700: 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d  sert(sizeof(x)==
2710: 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73  8);.    assert(s
2720: 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66  izeof(x)==sizeof
2730: 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (y));.    memcpy
2740: 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20  (&y, &x, 8);.   
2750: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2760: 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a  IsNaN(y) );.  }.
2770: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
2780: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69 6e 69   /* Do extra ini
2790: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  tialization step
27a0: 73 20 72 65 71 75 65 73 74 65 64 20 62 79 20 74  s requested by t
27b0: 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  he SQLITE_EXTRA_
27c0: 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c  INIT.  ** compil
27d0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20  e-time option.. 
27e0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
27f0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69  E_EXTRA_INIT.  i
2800: 66 28 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74  f( bRunExtraInit
2810: 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51 4c 49   ){.    int SQLI
2820: 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 63 6f  TE_EXTRA_INIT(co
2830: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
2840: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 58 54 52  rc = SQLITE_EXTR
2850: 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23  A_INIT(0);.  }.#
2860: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
2870: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  rc;.}../*.** Und
2880: 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
2890: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
28a0: 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74  ize().  Must not
28b0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65   be called while
28c0: 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75  .** there are ou
28d0: 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61  tstanding databa
28e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  se connections o
28f0: 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  r memory allocat
2900: 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65  ions or.** while
2910: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c   any part of SQL
2920: 69 74 65 20 69 73 20 6f 74 68 65 72 77 69 73 65  ite is otherwise
2930: 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74   in use in any t
2940: 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20  hread.  This.** 
2950: 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74  routine is not t
2960: 68 72 65 61 64 73 61 66 65 2e 20 20 42 75 74 20  hreadsafe.  But 
2970: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 69 6e  it is safe to in
2980: 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
2990: 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c  e.** on when SQL
29a0: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ite is already s
29b0: 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20 53 51  hut down.  If SQ
29c0: 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20  Lite is already 
29d0: 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65  shut down.** whe
29e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
29f0: 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20  s invoked, then 
2a00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2a10: 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
2a20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a30: 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b  _shutdown(void){
2a40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2a50: 4d 49 54 5f 57 53 44 0a 20 20 69 6e 74 20 72 63  MIT_WSD.  int rc
2a60: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
2a70: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
2a80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a90: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
2aa0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
2ab0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
2ad0: 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  t ){.#ifdef SQLI
2ae0: 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57  TE_EXTRA_SHUTDOW
2af0: 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c 49 54  N.    void SQLIT
2b00: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
2b10: 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51 4c 49  (void);.    SQLI
2b20: 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57  TE_EXTRA_SHUTDOW
2b30: 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  N();.#endif.    
2b40: 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29  sqlite3_os_end()
2b50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
2b60: 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69  set_auto_extensi
2b70: 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  on();.    sqlite
2b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2b90: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2ba0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2bb0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2bc0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2bd0: 74 65 33 50 63 61 63 68 65 53 68 75 74 64 6f 77  te3PcacheShutdow
2be0: 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n();.    sqlite3
2bf0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50  GlobalConfig.isP
2c00: 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20  CacheInit = 0;. 
2c10: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2c20: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2c30: 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20  allocInit ){.   
2c40: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e   sqlite3MallocEn
2c50: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2c60: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2c70: 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 0a  allocInit = 0;..
2c80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c90: 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44 49 52  MIT_SHUTDOWN_DIR
2ca0: 45 43 54 4f 52 49 45 53 0a 20 20 20 20 2f 2a 20  ECTORIES.    /* 
2cb0: 54 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  The heap subsyst
2cc0: 65 6d 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  em has now been 
2cd0: 73 68 75 74 64 6f 77 6e 20 61 6e 64 20 74 68 65  shutdown and the
2ce0: 73 65 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  se values are su
2cf0: 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20 74 6f  pposed.    ** to
2d00: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f 69 6e   be NULL or poin
2d10: 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74  t to memory that
2d20: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
2d30: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
2d40: 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63  c(),.    ** whic
2d50: 68 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f 6e 20  h would rely on 
2d60: 74 68 61 74 20 68 65 61 70 20 73 75 62 73 79 73  that heap subsys
2d70: 74 65 6d 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  tem; therefore, 
2d80: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 73 65 0a  make sure these.
2d90: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 63 61      ** values ca
2da0: 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 68 65  nnot refer to he
2db0: 61 70 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ap memory that w
2dc0: 61 73 20 6a 75 73 74 20 69 6e 76 61 6c 69 64 61  as just invalida
2dd0: 74 65 64 20 77 68 65 6e 20 74 68 65 0a 20 20 20  ted when the.   
2de0: 20 2a 2a 20 68 65 61 70 20 73 75 62 73 79 73 74   ** heap subsyst
2df0: 65 6d 20 77 61 73 20 73 68 75 74 64 6f 77 6e 2e  em was shutdown.
2e00: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64    This is only d
2e10: 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 72 65  one if the curre
2e20: 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  nt call to.    *
2e30: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2e40: 72 65 73 75 6c 74 65 64 20 69 6e 20 74 68 65 20  resulted in the 
2e50: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 61  heap subsystem a
2e60: 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 68  ctually being sh
2e70: 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f 0a 20  utdown..    */. 
2e80: 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
2e90: 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20  directory = 0;. 
2ea0: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f     sqlite3_temp_
2eb0: 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23  directory = 0;.#
2ec0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20  endif.  }.  if( 
2ed0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ee0: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
2ef0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75  ){.    sqlite3Mu
2f00: 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71  texEnd();.    sq
2f10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2f20: 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20  g.isMutexInit = 
2f30: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
2f40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2f50: 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c  *.** This API al
2f60: 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  lows application
2f70: 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  s to modify the 
2f80: 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61  global configura
2f90: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53  tion of.** the S
2fa0: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 74  QLite library at
2fb0: 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a   run-time..**.**
2fc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
2fd0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2fe0: 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  led when there a
2ff0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
3000: 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  g.** database co
3010: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
3020: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e  ory allocations.
3030: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
3040: 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  s not.** threads
3050: 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f  afe.  Failure to
3060: 20 68 65 65 64 20 74 68 65 73 65 20 77 61 72 6e   heed these warn
3070: 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f  ings can lead to
3080: 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a   unpredictable.*
3090: 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  * behavior..*/.i
30a0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  nt sqlite3_confi
30b0: 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  g(int op, ...){.
30c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
30d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30e0: 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65  OK;..  /* sqlite
30f0: 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c  3_config() shall
3100: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
3110: 49 53 55 53 45 20 69 66 20 69 74 20 69 73 20 69  ISUSE if it is i
3120: 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a  nvoked while.  *
3130: 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  * the SQLite lib
3140: 72 61 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20  rary is in use. 
3150: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
3160: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
3170: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
3180: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
3190: 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ..  va_start(ap,
31a0: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
31b0: 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75  op ){..    /* Mu
31c0: 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  tex configuratio
31d0: 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e  n options are on
31e0: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
31f0: 61 20 74 68 72 65 61 64 73 61 66 65 0a 20 20 20  a threadsafe.   
3200: 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a 20 20 20   ** compile..   
3210: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
3220: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3230: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3240: 45 41 44 53 41 46 45 3e 30 20 20 2f 2a 20 49 4d  EADSAFE>0  /* IM
3250: 50 3a 20 52 2d 35 34 34 36 36 2d 34 36 37 35 36  P: R-54466-46756
3260: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
3270: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c  ITE_CONFIG_SINGL
3280: 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20  ETHREAD: {.     
3290: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
32a0: 20 52 2d 30 32 37 34 38 2d 31 39 30 39 36 20 54   R-02748-19096 T
32b0: 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20  his option sets 
32c0: 74 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f  the threading mo
32d0: 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53  de to.      ** S
32e0: 69 6e 67 6c 65 2d 74 68 72 65 61 64 2e 20 2a 2f  ingle-thread. */
32f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3300: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
3310: 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44  Mutex = 0;  /* D
3320: 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20  isable mutex on 
3330: 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  core */.      sq
3340: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3350: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
3360: 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75  ;  /* Disable mu
3370: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3380: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3390: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
33a0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
33b0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
33c0: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
33d0: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
33e0: 32 30 35 32 30 2d 35 34 30 38 36 20 2a 2f 0a 20  20520-54086 */. 
33f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3400: 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41  ONFIG_MULTITHREA
3410: 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  D: {.      /* EV
3420: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 33  IDENCE-OF: R-143
3430: 37 34 2d 34 32 34 36 38 20 54 68 69 73 20 6f 70  74-42468 This op
3440: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68  tion sets the th
3450: 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a  reading mode to.
3460: 20 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69 2d 74        ** Multi-t
3470: 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20  hread. */.      
3480: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3490: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
34a0: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
34b0: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
34c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
34d0: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
34e0: 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69  utex = 0;  /* Di
34f0: 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  sable mutex on c
3500: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
3510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3520: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3530: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3540: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3550: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3560: 20 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d 32 31   IMP: R-59593-21
3570: 38 31 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  810 */.    case 
3580: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45  SQLITE_CONFIG_SE
3590: 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20  RIALIZED: {.    
35a0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
35b0: 3a 20 52 2d 34 31 32 32 30 2d 35 31 38 30 30 20  : R-41220-51800 
35c0: 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73  This option sets
35d0: 20 74 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d   the threading m
35e0: 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ode to.      ** 
35f0: 53 65 72 69 61 6c 69 7a 65 64 2e 20 2a 2f 0a 20  Serialized. */. 
3600: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3610: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
3620: 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61  tex = 1;  /* Ena
3630: 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72  ble mutex on cor
3640: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
3650: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3660: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 20 20  FullMutex = 1;  
3670: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
3680: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
3690: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
36a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
36b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
36c0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
36d0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
36e0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36  0 /* IMP: R-6366
36f0: 36 2d 34 38 37 35 35 20 2a 2f 0a 20 20 20 20 63  6-48755 */.    c
3700: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3710: 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20  G_MUTEX: {.     
3720: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
3730: 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78  lternative mutex
3740: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3750: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3760: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
3770: 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c  ex = *va_arg(ap,
3780: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
3790: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
37a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
37b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
37c0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
37d0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
37e0: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
37f0: 3a 20 52 2d 31 34 34 35 30 2d 33 37 35 39 37 20  : R-14450-37597 
3800: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3810: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54  TE_CONFIG_GETMUT
3820: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52  EX: {.      /* R
3830: 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72  etrieve the curr
3840: 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ent mutex implem
3850: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3860: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
3870: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
3880: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3890: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
38a0: 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
38b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
38c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
38d0: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
38e0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
38f0: 2d 4f 46 3a 20 52 2d 35 35 35 39 34 2d 32 31 30  -OF: R-55594-210
3900: 33 30 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  30 The SQLITE_CO
3910: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69  NFIG_MALLOC opti
3920: 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20  on takes a.     
3930: 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d   ** single argum
3940: 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70  ent which is a p
3950: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
3960: 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20  tance of the.   
3970: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65     ** sqlite3_me
3980: 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74  m_methods struct
3990: 75 72 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ure. The argumen
39a0: 74 20 73 70 65 63 69 66 69 65 73 20 61 6c 74 65  t specifies alte
39b0: 72 6e 61 74 69 76 65 0a 20 20 20 20 20 20 2a 2a  rnative.      **
39c0: 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72   low-level memor
39d0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75  y allocation rou
39e0: 74 69 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64  tines to be used
39f0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
3a00: 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a   memory.      **
3a10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74   allocation rout
3a20: 69 6e 65 73 20 62 75 69 6c 74 20 69 6e 74 6f 20  ines built into 
3a30: 53 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20  SQLite. */.     
3a40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3a50: 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67  nfig.m = *va_arg
3a60: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
3a70: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
3a80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3a90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3aa0: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a  ONFIG_GETMALLOC:
3ab0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3ac0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33  ENCE-OF: R-51213
3ad0: 2d 34 36 34 31 34 20 54 68 65 20 53 51 4c 49 54  -46414 The SQLIT
3ae0: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c  E_CONFIG_GETMALL
3af0: 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  OC option takes 
3b00: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
3b10: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
3b20: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
3b30: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
3b40: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
3b50: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3b60: 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20   structure. The 
3b70: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3b80: 6f 64 73 20 73 74 72 75 63 74 75 72 65 20 69 73  ods structure is
3b90: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
3ba0: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
3bb0: 74 6c 79 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f  tly defined memo
3bc0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f  ry allocation ro
3bd0: 75 74 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20  utines. */.     
3be0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3bf0: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
3c00: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
3c10: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
3c20: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3c30: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3c40: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
3c50: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b  3GlobalConfig.m;
3c60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3c70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3c80: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
3c90: 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATUS: {.      /*
3ca0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3cb0: 36 31 32 37 35 2d 33 35 31 35 37 20 54 68 65 20  61275-35157 The 
3cc0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
3cd0: 4d 53 54 41 54 55 53 20 6f 70 74 69 6f 6e 20 74  MSTATUS option t
3ce0: 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 69  akes.      ** si
3cf0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f 66  ngle argument of
3d00: 20 74 79 70 65 20 69 6e 74 2c 20 69 6e 74 65 72   type int, inter
3d10: 70 72 65 74 65 64 20 61 73 20 61 20 62 6f 6f 6c  preted as a bool
3d20: 65 61 6e 2c 20 77 68 69 63 68 20 65 6e 61 62 6c  ean, which enabl
3d30: 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 64  es.      ** or d
3d40: 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c  isables the coll
3d50: 65 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79  ection of memory
3d60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74   allocation stat
3d70: 69 73 74 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20  istics. */.     
3d80: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3d90: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20  nfig.bMemstat = 
3da0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3db0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3dc0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3dd0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 4d 41 4c 4c  ITE_CONFIG_SMALL
3de0: 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  _MALLOC: {.     
3df0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3e00: 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d 61 6c 6c 6f  nfig.bSmallMallo
3e10: 63 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  c = va_arg(ap, i
3e20: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e40: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3e50: 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  AGECACHE: {.    
3e60: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3e70: 3a 20 52 2d 31 38 37 36 31 2d 33 36 36 30 31 20  : R-18761-36601 
3e80: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
3e90: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
3ea0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
3eb0: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 41  FIG_PAGECACHE: A
3ec0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 38 2d 62 79   pointer to 8-by
3ed0: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3ee0: 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20  y (pMem),.      
3ef0: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65  ** the size of e
3f00: 61 63 68 20 70 61 67 65 20 63 61 63 68 65 20 6c  ach page cache l
3f10: 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ine (sz), and th
3f20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
3f30: 65 20 6c 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  e lines.      **
3f40: 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73   (N). */.      s
3f50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3f60: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
3f70: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3f80: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3f90: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
3fa0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3fb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
3fc0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
3fd0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3fe0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4000: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4010: 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20  CACHE_HDRSZ: {. 
4020: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
4030: 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32 37 33  -OF: R-39100-273
4040: 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  17 The SQLITE_CO
4050: 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53  NFIG_PCACHE_HDRS
4060: 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  Z option takes. 
4070: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
4080: 20 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68   parameter which
4090: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
40a0: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
40b0: 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20 20 20  writes into.    
40c0: 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65    ** that intege
40d0: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
40e0: 65 78 74 72 61 20 62 79 74 65 73 20 70 65 72 20  extra bytes per 
40f0: 70 61 67 65 20 72 65 71 75 69 72 65 64 20 66 6f  page required fo
4100: 72 20 65 61 63 68 20 70 61 67 65 0a 20 20 20 20  r each page.    
4110: 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43    ** in SQLITE_C
4120: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e  ONFIG_PAGECACHE.
4130: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
4140: 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20  g(ap, int*) = . 
4150: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4160: 48 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28  HeaderSizeBtree(
4170: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
4180: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4190: 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20 20 20  cache() +.      
41a0: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
41b0: 72 53 69 7a 65 50 63 61 63 68 65 31 28 29 3b 0a  rSizePcache1();.
41c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
41d0: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
41e0: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
41f0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
4200: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
4210: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4220: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4230: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
4240: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
4250: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
4260: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
4270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4280: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4290: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
42a0: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  E2: {.      /* E
42b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
42c0: 33 32 35 2d 34 38 33 37 38 20 54 68 65 20 53 51  325-48378 The SQ
42d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
42e0: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
42f0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
4300: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
4310: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
4320: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
4330: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
4340: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68     ** object. Th
4350: 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63 69 66  is object specif
4360: 69 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63  ies the interfac
4370: 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20 70 61  e to a custom pa
4380: 67 65 20 63 61 63 68 65 0a 20 20 20 20 20 20 2a  ge cache.      *
4390: 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
43a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
43b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
43c0: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
43d0: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
43e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
43f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4400: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
4410: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
4420: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
4430: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4440: 32 32 30 33 35 2d 34 36 31 38 32 20 54 68 65 20  22035-46182 The 
4450: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4460: 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20  TPCACHE2 option 
4470: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
4480: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4490: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
44a0: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
44b0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
44c0: 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  2.      ** objec
44d0: 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73  t. SQLite copies
44e0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
44f0: 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65  page cache imple
4500: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20  mentation into. 
4510: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a       ** that obj
4520: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ect. */.      if
4530: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
4540: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
4550: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
4560: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
4570: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
4580: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
4590: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
45a0: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
45b0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
45c0: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
45d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45e0: 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d   }../* EVIDENCE-
45f0: 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32 39 31  OF: R-06626-1291
4600: 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  1 The SQLITE_CON
4610: 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20  FIG_HEAP option 
4620: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  is only.** avail
4630: 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69  able if SQLite i
4640: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
4650: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 45 4e  either SQLITE_EN
4660: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a  ABLE_MEMSYS3 or.
4670: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
4680: 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72 65 74  _MEMSYS5 and ret
4690: 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f  urns SQLITE_ERRO
46a0: 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68  R if invoked oth
46b0: 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64  erwise. */.#if d
46c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
46d0: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
46e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
46f0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
4700: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4710: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
4720: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
4730: 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34 32 31  -OF: R-19854-421
4740: 32 36 20 54 68 65 72 65 20 61 72 65 20 74 68 72  26 There are thr
4750: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
4760: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4770: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41 6e 20  CONFIG_HEAP: An 
4780: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 70  8-byte aligned p
4790: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65  ointer to the me
47a0: 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20 20 20  mory, the.      
47b0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
47c0: 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79  es in the memory
47d0: 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74 68 65   buffer, and the
47e0: 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   minimum allocat
47f0: 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20 20 20  ion size..      
4800: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
4810: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
4820: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
4830: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
4840: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4850: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
4860: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4870: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4880: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
4890: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
48a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
48b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
48c0: 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eq<1 ){.        
48d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
48e0: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20  fig.mnReq = 1;. 
48f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
4900: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4910: 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29  ig.mnReq>(1<<12)
4920: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
4930: 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73  ap min request s
4940: 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20  ize at 2^12 */. 
4950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
4960: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
4970: 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20   = (1<<12);.    
4980: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
4990: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
49a0: 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
49b0: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
49c0: 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36  CE-OF: R-49920-6
49d0: 30 31 38 39 20 49 66 20 74 68 65 20 66 69 72 73  0189 If the firs
49e0: 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d  t pointer (the m
49f0: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 0a 20  emory pointer). 
4a00: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c         ** is NUL
4a10: 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 72  L, then SQLite r
4a20: 65 76 65 72 74 73 20 74 6f 20 75 73 69 6e 67 20  everts to using 
4a30: 69 74 73 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  its default memo
4a40: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20  ry allocator.   
4a50: 20 20 20 20 20 2a 2a 20 28 74 68 65 20 73 79 73       ** (the sys
4a60: 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70  tem malloc() imp
4a70: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e  lementation), un
4a80: 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f 72 20  doing any prior 
4a90: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20  invocation of.  
4aa0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4ab0: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20  CONFIG_MALLOC.. 
4ac0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4ad0: 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 73 71 6c    ** Setting sql
4ae0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4af0: 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20  .m to all zeros 
4b00: 77 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f  will cause mallo
4b10: 63 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  c to.        ** 
4b20: 72 65 76 65 72 74 20 74 6f 20 69 74 73 20 64 65  revert to its de
4b30: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
4b40: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
4b50: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
4b60: 73 20 72 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f  s run.        */
4b70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
4b80: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
4b90: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
4ba0: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
4bb0: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
4bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4bd0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4be0: 52 2d 36 31 30 30 36 2d 30 38 39 31 38 20 49 66  R-61006-08918 If
4bf0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e   the memory poin
4c00: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
4c10: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
4c20: 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20   ** alternative 
4c30: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4c40: 20 69 73 20 65 6e 67 61 67 65 64 20 74 6f 20 68   is engaged to h
4c50: 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c  andle all of SQL
4c60: 69 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ites.        ** 
4c70: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4c80: 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64  n needs. */.#ifd
4c90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4ca0: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
4cb0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4cc0: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4cd0: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
4ce0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4cf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4d00: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
4d10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4d20: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4d30: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
4d40: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
4d50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4d60: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
4d70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4d80: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
4d90: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4da0: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
4db0: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
4dc0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4dd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4de0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
4df0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e10: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
4e20: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
4e30: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
4e40: 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72  tion and its fir
4e50: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
4e60: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
4e70: 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e  is NULL.  Loggin
4e80: 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66  g is disabled if
4e90: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f   the function po
4ea0: 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  inter is.    ** 
4eb0: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
4ec0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4ed0: 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  FIG_LOG: {.     
4ee0: 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
4ef0: 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
4f00: 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
4f10: 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
4f20: 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
4f30: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
4f40: 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
4f50: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4f60: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
4f70: 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76  rg(ap, void(*)(v
4f80: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
4f90: 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f  har*));.      */
4fa0: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
4fb0: 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28  oid(*LOGFUNC_t)(
4fc0: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
4fd0: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
4fe0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4ff0: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
5000: 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a  ap, LOGFUNC_t);.
5010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5020: 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72  balConfig.pLogAr
5030: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
5040: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  oid*);.      bre
5050: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5060: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5070: 2d 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65  -55548-33817 The
5080: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65   compile-time se
5090: 74 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69  tting for URI fi
50a0: 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63  lenames.    ** c
50b0: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74  an be changed at
50c0: 20 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e   start-time usin
50d0: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  g the.    ** sql
50e0: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
50f0: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29  TE_CONFIG_URI,1)
5100: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
5110: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
5120: 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63  _CONFIG_URI,0) c
5130: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c  onfiguration cal
5140: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
5150: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5160: 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f  G_URI: {.      /
5170: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5180: 2d 32 35 34 35 31 2d 36 31 31 32 35 20 54 68 65  -25451-61125 The
5190: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
51a0: 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  RI option takes 
51b0: 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a  a single.      *
51c0: 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  * argument of ty
51d0: 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a  pe int. If non-z
51e0: 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61  ero, then URI ha
51f0: 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c  ndling is global
5200: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  ly.      ** enab
5210: 6c 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61  led. If the para
5220: 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  meter is zero, t
5230: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
5240: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5250: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20     ** disabled. 
5260: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5270: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
5280: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
5290: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
52a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
52b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
52c0: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
52d0: 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20  EX_SCAN: {.     
52e0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
52f0: 20 52 2d 33 36 35 39 32 2d 30 32 37 37 32 20 54   R-36592-02772 T
5300: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
5310: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
5320: 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70  SCAN.      ** op
5330: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
5340: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
5350: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6e  ment which is in
5360: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 20  terpreted as a. 
5370: 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20       ** boolean 
5380: 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 61 62  in order to enab
5390: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
53a0: 65 20 75 73 65 20 6f 66 20 63 6f 76 65 72 69 6e  e use of coverin
53b0: 67 20 69 6e 64 69 63 65 73 20 66 6f 72 0a 20 20  g indices for.  
53c0: 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c      ** full tabl
53d0: 65 20 73 63 61 6e 73 20 69 6e 20 74 68 65 20 71  e scans in the q
53e0: 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20  uery optimizer. 
53f0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5400: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
5410: 65 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70  eCis = va_arg(ap
5420: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
5430: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
5440: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5450: 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65  _SQLLOG.    case
5460: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
5470: 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74  QLLOG: {.      t
5480: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c  ypedef void(*SQL
5490: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
54a0: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
54b0: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20  t char*, int);. 
54c0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
54d0: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
54e0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51   = va_arg(ap, SQ
54f0: 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20  LLOGFUNC_t);.   
5500: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5510: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
5520: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
5530: 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72  oid *);.      br
5540: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5550: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
5560: 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53  TE_CONFIG_MMAP_S
5570: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IZE: {.      /* 
5580: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5590: 38 30 36 33 2d 33 38 32 35 38 20 53 51 4c 49 54  8063-38258 SQLIT
55a0: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
55b0: 5a 45 20 74 61 6b 65 73 20 74 77 6f 20 36 34 2d  ZE takes two 64-
55c0: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  bit.      ** int
55d0: 65 67 65 72 20 28 73 71 6c 69 74 65 33 5f 69 6e  eger (sqlite3_in
55e0: 74 36 34 29 20 76 61 6c 75 65 73 20 74 68 61 74  t64) values that
55f0: 20 61 72 65 20 74 68 65 20 64 65 66 61 75 6c 74   are the default
5600: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
5610: 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 64  .      ** (the d
5620: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 66  efault setting f
5630: 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73  or PRAGMA mmap_s
5640: 69 7a 65 29 20 61 6e 64 20 74 68 65 20 6d 61 78  ize) and the max
5650: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20  imum allowed.   
5660: 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20     ** mmap size 
5670: 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  limit. */.      
5680: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
5690: 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
56a0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
56b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
56c0: 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76  int64 mxMmap = v
56d0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
56e0: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
56f0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
5700: 52 2d 35 33 33 36 37 2d 34 33 31 39 30 20 49 66  R-53367-43190 If
5710: 20 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74   either argument
5720: 20 74 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   to this option 
5730: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65 67 61  is.      ** nega
5740: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 61 74 20  tive, then that 
5750: 61 72 67 75 6d 65 6e 74 20 69 73 20 63 68 61 6e  argument is chan
5760: 67 65 64 20 74 6f 20 69 74 73 20 63 6f 6d 70 69  ged to its compi
5770: 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c 74 2e  le-time default.
5780: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5790: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
57a0: 52 2d 33 34 39 39 33 2d 34 35 30 33 31 20 54 68  R-34993-45031 Th
57b0: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
57c0: 64 20 6d 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c  d mmap size will
57d0: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c   be.      ** sil
57e0: 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 20  ently truncated 
57f0: 69 66 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  if necessary so 
5800: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
5810: 20 65 78 63 65 65 64 20 74 68 65 0a 20 20 20 20   exceed the.    
5820: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
5830: 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  e maximum mmap s
5840: 69 7a 65 20 73 65 74 20 62 79 20 74 68 65 20 53  ize set by the S
5850: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
5860: 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  IZE.      ** com
5870: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
5880: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5890: 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c   if( mxMmap<0 ||
58a0: 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d   mxMmap>SQLITE_M
58b0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a  AX_MMAP_SIZE ){.
58c0: 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d          mxMmap =
58d0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
58e0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _SIZE;.      }. 
58f0: 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c       if( szMmap<
5900: 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  0 ) szMmap = SQL
5910: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
5920: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28  _SIZE;.      if(
5930: 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20   szMmap>mxMmap) 
5940: 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b  szMmap = mxMmap;
5950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5960: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
5970: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5980: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5990: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73  onfig.szMmap = s
59a0: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65  zMmap;.      bre
59b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53  ak;.    }..#if S
59c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20  QLITE_OS_WIN && 
59d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
59e0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20  IN32_MALLOC) /* 
59f0: 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35 35 38  IMP: R-04780-558
5a00: 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  15 */.    case S
5a10: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
5a20: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
5a30: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5a40: 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30 33 33  -OF: R-34926-033
5a50: 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  60 SQLITE_CONFIG
5a60: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 20  _WIN32_HEAPSIZE 
5a70: 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74 0a 20  takes a 32-bit. 
5a80: 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64       ** unsigned
5a90: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74   integer value t
5aa0: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
5ab0: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
5ac0: 66 20 74 68 65 20 63 72 65 61 74 65 64 0a 20 20  f the created.  
5ad0: 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a      ** heap. */.
5ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5af0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
5b00: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5b10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5b20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5b30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5b40: 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20  NFIG_PMASZ: {.  
5b50: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5b60: 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20  lConfig.szPma = 
5b70: 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
5b80: 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
5b90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5ba0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5bb0: 4e 46 49 47 5f 53 54 4d 54 4a 52 4e 4c 5f 53 50  NFIG_STMTJRNL_SP
5bc0: 49 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILL: {.      sql
5bd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5be0: 2e 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 76 61  .nStmtSpill = va
5bf0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5c00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c10: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
5c20: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5c30: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
5c40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5c50: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
5c60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5c70: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
5c80: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5c90: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
5ca0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
5cb0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5cc0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
5cd0: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
5ce0: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
5cf0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
5d00: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
5d10: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
5d20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5d30: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
5d40: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
5d50: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
5d60: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5d70: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
5d80: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
5d90: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
5da0: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
5db0: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
5dc0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
5dd0: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
5de0: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
5df0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
5e00: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
5e10: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
5e20: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
5e30: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
5e40: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
5e50: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
5e60: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
5e70: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66  z, int cnt){.#if
5e80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5e90: 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69  _LOOKASIDE.  voi
5ea0: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 0a 20 20  d *pStart;.  .  
5eb0: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 6f 6b 61  if( sqlite3Looka
5ec0: 73 69 64 65 55 73 65 64 28 64 62 2c 30 29 3e 30  sideUsed(db,0)>0
5ed0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5ee0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
5ef0: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78    /* Free any ex
5f00: 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65  isting lookaside
5f10: 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73   buffer for this
5f20: 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20   handle before. 
5f30: 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61   ** allocating a
5f40: 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64   new one so we d
5f50: 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76  on't have to hav
5f60: 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a  e space for .  *
5f70: 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61  * both at the sa
5f80: 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  me time..  */.  
5f90: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
5fa0: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20  e.bMalloced ){. 
5fb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5fc0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
5fd0: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  tart);.  }.  /* 
5fe0: 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f  The size of a lo
5ff0: 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74  okaside slot aft
6000: 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65  er ROUNDDOWN8 ne
6010: 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72  eds to be larger
6020: 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69  .  ** than a poi
6030: 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75  nter to be usefu
6040: 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52  l..  */.  sz = R
6050: 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20  OUNDDOWN8(sz);  
6060: 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d  /* IMP: R-33038-
6070: 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73  09382 */.  if( s
6080: 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c  z<=(int)sizeof(L
6090: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29  ookasideSlot*) )
60a0: 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63   sz = 0;.  if( c
60b0: 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a  nt<0 ) cnt = 0;.
60c0: 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63    if( sz==0 || c
60d0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20  nt==0 ){.    sz 
60e0: 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20  = 0;.    pStart 
60f0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
6100: 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pBuf==0 ){.    
6110: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
6120: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
6130: 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
6140: 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29  Malloc( sz*cnt )
6150: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39  ;  /* IMP: R-619
6160: 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20  49-35727 */.    
6170: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
6180: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
6190: 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d  ( pStart ) cnt =
61a0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
61b0: 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20  ze(pStart)/sz;. 
61c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61   }else{.    pSta
61d0: 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20  rt = pBuf;.  }. 
61e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
61f0: 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a  Start = pStart;.
6200: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6210: 70 49 6e 69 74 20 3d 20 30 3b 0a 20 20 64 62 2d  pInit = 0;.  db-
6220: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
6230: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
6240: 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29  aside.sz = (u16)
6250: 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74  sz;.  if( pStart
6260: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6270: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
6280: 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
6290: 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f   sz > (int)sizeo
62a0: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
62b0: 29 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  ) );.    db->loo
62c0: 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d 20 63  kaside.nSlot = c
62d0: 6e 74 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f  nt;.    p = (Loo
62e0: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61  kasideSlot*)pSta
62f0: 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e  rt;.    for(i=cn
6300: 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  t-1; i>=0; i--){
6310: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
6320: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
6330: 70 49 6e 69 74 3b 0a 20 20 20 20 20 20 64 62 2d  pInit;.      db-
6340: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74  >lookaside.pInit
6350: 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20   = p;.      p = 
6360: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
6370: 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20  &((u8*)p)[sz];. 
6380: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f     }.    db->loo
6390: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b  kaside.pEnd = p;
63a0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
63b0: 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 30 3b  de.bDisable = 0;
63c0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
63d0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70  de.bMalloced = p
63e0: 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d  Buf==0 ?1:0;.  }
63f0: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f  else{.    db->lo
6400: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d  okaside.pStart =
6410: 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   db;.    db->loo
6420: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64 62  kaside.pEnd = db
6430: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
6440: 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 31  ide.bDisable = 1
6450: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
6460: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
6470: 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  0;.    db->looka
6480: 73 69 64 65 2e 6e 53 6c 6f 74 20 3d 20 30 3b 0a  side.nSlot = 0;.
6490: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
64a0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53  LITE_OMIT_LOOKAS
64b0: 49 44 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IDE */.  return 
64c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
64d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
64e0: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
64f0: 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
6500: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
6510: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71  qlite3_mutex *sq
6520: 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73  lite3_db_mutex(s
6530: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
6540: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6550: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
6560: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
6570: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
6580: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
6590: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
65a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
65b0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64  endif.  return d
65c0: 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a  b->mutex;.}../*.
65d0: 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d 75  ** Free up as mu
65e0: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20  ch memory as we 
65f0: 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76  can from the giv
6600: 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  en database.** c
6610: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  onnection..*/.in
6620: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c  t sqlite3_db_rel
6630: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69  ease_memory(sqli
6640: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
6650: 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  i;..#ifdef SQLIT
6660: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
6670: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
6680: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
6690: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
66a0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
66b0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
66c0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
66d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74  >mutex);.  sqlit
66e0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
66f0: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
6700: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
6710: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
6720: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
6730: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b  ;.    if( pBt ){
6740: 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
6750: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
6760: 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20  reePager(pBt);. 
6770: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
6780: 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29 3b  rShrink(pPager);
6790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
67a0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
67b0: 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  l(db);.  sqlite3
67c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
67d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
67e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
67f0: 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
6800: 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
6810: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 66  he pager-cache f
6820: 6f 72 20 61 6e 79 20 61 74 74 61 63 68 65 64 20  or any attached 
6830: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 6f 20 64  database.** to d
6840: 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
6850: 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73  te3_db_cacheflus
6860: 68 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  h(sqlite3 *db){.
6870: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
6880: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6890: 20 69 6e 74 20 62 53 65 65 6e 42 75 73 79 20 3d   int bSeenBusy =
68a0: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
68b0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
68c0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
68d0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
68e0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
68f0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6900: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
6910: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
6920: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
6930: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
6940: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
6950: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6960: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
6970: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
6980: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
6990: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
69a0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
69b0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
69c0: 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
69d0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
69e0: 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20  reePager(pBt);. 
69f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6a00: 33 50 61 67 65 72 46 6c 75 73 68 28 70 50 61 67  3PagerFlush(pPag
6a10: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
6a20: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
6a30: 7b 0a 20 20 20 20 20 20 20 20 62 53 65 65 6e 42  {.        bSeenB
6a40: 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  usy = 1;.       
6a50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6a60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6a70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
6a80: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
6a90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
6aa0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
6ab0: 0a 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d  .  return ((rc==
6ac0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 53 65  SQLITE_OK && bSe
6ad0: 65 6e 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45  enBusy) ? SQLITE
6ae0: 5f 42 55 53 59 20 3a 20 72 63 29 3b 0a 7d 0a 0a  _BUSY : rc);.}..
6af0: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  /*.** Configurat
6b00: 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72  ion settings for
6b10: 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64   an individual d
6b20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6b30: 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  on.*/.int sqlite
6b40: 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69  3_db_config(sqli
6b50: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c  te3 *db, int op,
6b60: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
6b70: 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   ap;.  int rc;. 
6b80: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
6b90: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
6ba0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
6bb0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e  TE_DBCONFIG_MAIN
6bc0: 44 42 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  DBNAME: {.      
6bd0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 36 38 32 34 2d  /* IMP: R-06824-
6be0: 32 38 35 33 31 20 2a 2f 0a 20 20 20 20 20 20 2f  28531 */.      /
6bf0: 2a 20 49 4d 50 3a 20 52 2d 33 36 32 35 37 2d 35  * IMP: R-36257-5
6c00: 32 31 32 35 20 2a 2f 0a 20 20 20 20 20 20 64 62  2125 */.      db
6c10: 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[0].zDbSNam
6c20: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68  e = va_arg(ap,ch
6c30: 61 72 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ar*);.      rc =
6c40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6c60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6c70: 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  BCONFIG_LOOKASID
6c80: 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  E: {.      void 
6c90: 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61  *pBuf = va_arg(a
6ca0: 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d  p, void*); /* IM
6cb0: 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34  P: R-26835-10964
6cc0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
6cd0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6ce0: 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50  t);       /* IMP
6cf0: 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20  : R-47871-25994 
6d00: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
6d10: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
6d20: 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  t);      /* IMP:
6d30: 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a   R-04460-53386 *
6d40: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74  /.      rc = set
6d50: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
6d60: 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a  pBuf, sz, cnt);.
6d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d80: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6d90: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
6da0: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
6db0: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
6dc0: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6dd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
6de0: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b  mask;    /* Mask
6df0: 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73   of the bit in s
6e00: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20  qlite3.flags to 
6e10: 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20  set/clear */.   
6e20: 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d     } aFlagOp[] =
6e30: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c   {.        { SQL
6e40: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
6e50: 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 20 20 20  BLE_FKEY,       
6e60: 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69      SQLITE_Forei
6e70: 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20  gnKeys    },.   
6e80: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
6e90: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
6ea0: 49 47 47 45 52 2c 20 20 20 20 20 20 20 20 53 51  IGGER,        SQ
6eb0: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
6ec0: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  er  },.        {
6ed0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
6ee0: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
6ef0: 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46  ENIZER, SQLITE_F
6f00: 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c  ts3Tokenizer  },
6f10: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6f20: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6f30: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
6f40: 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  , SQLITE_LoadExt
6f50: 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  ension  },.     
6f60: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6f70: 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f  NFIG_NO_CKPT_ON_
6f80: 43 4c 4f 53 45 2c 20 20 20 20 20 20 53 51 4c 49  CLOSE,      SQLI
6f90: 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65  TE_NoCkptOnClose
6fa0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
6fb0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
6fc0: 4e 41 42 4c 45 5f 51 50 53 47 2c 20 20 20 20 20  NABLE_QPSG,     
6fd0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 6e 61        SQLITE_Ena
6fe0: 62 6c 65 51 50 53 47 20 20 20 20 20 7d 2c 0a 20  bleQPSG     },. 
6ff0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e       };.      un
7000: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
7010: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7020: 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52  ERROR; /* IMP: R
7030: 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a  -42790-23372 */.
7040: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7050: 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67  <ArraySize(aFlag
7060: 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Op); i++){.     
7070: 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69     if( aFlagOp[i
7080: 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20  ].op==op ){.    
7090: 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20        int onoff 
70a0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
70b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
70c0: 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28   *pRes = va_arg(
70d0: 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
70e0: 20 20 20 20 20 75 33 32 20 6f 6c 64 46 6c 61 67       u32 oldFlag
70f0: 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
7100: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f           if( ono
7110: 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>0 ){.        
7120: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
7130: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
7140: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7150: 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29  e if( onoff==0 )
7160: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  {.            db
7170: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61  ->flags &= ~aFla
7180: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  gOp[i].mask;.   
7190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
71a0: 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21     if( oldFlags!
71b0: 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20  =db->flags ){.  
71c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
71d0: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
71e0: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
71f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7200: 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b       if( pRes ){
7210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52  .            *pR
7220: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
7230: 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73  & aFlagOp[i].mas
7240: 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  k)!=0;.         
7250: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
7260: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
7270: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
72a0: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
72b0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
72c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
72d0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62  rn true if the b
72e0: 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  uffer z[0..n-1] 
72f0: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61  contains all spa
7300: 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ces..*/.static i
7310: 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e  nt allSpaces(con
7320: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
7330: 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  n){.  while( n>0
7340: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20   && z[n-1]==' ' 
7350: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75  ){ n--; }.  retu
7360: 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn n==0;.}../*.*
7370: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65  * This is the de
7380: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
7390: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
73a0: 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73  BINARY" which is
73b0: 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c   always.** avail
73c0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
73d0: 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d  he padFlag argum
73e0: 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ent is not NULL 
73f0: 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69  then space paddi
7400: 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a  ng at the end.**
7410: 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69   of strings is i
7420: 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d  gnored.  This im
7430: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52  plements the RTR
7440: 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f  IM collation..*/
7450: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43  .static int binC
7460: 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20  ollFunc(.  void 
7470: 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20  *padFlag,.  int 
7480: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
7490: 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
74a0: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
74b0: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
74c0: 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e  t rc, n;.  n = n
74d0: 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65  Key1<nKey2 ? nKe
74e0: 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a  y1 : nKey2;.  /*
74f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
7500: 36 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20  65033-28449 The 
7510: 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20  built-in BINARY 
7520: 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72  collation compar
7530: 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  es.  ** strings 
7540: 62 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69  byte by byte usi
7550: 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20  ng the memcmp() 
7560: 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68  function from th
7570: 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a  e standard C.  *
7580: 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20  * library. */.  
7590: 61 73 73 65 72 74 28 20 70 4b 65 79 31 20 26 26  assert( pKey1 &&
75a0: 20 70 4b 65 79 32 20 29 3b 0a 20 20 72 63 20 3d   pKey2 );.  rc =
75b0: 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
75c0: 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
75d0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
75e0: 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26   padFlag.     &&
75f0: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
7600: 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65  r*)pKey1)+n, nKe
7610: 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c  y1-n).     && al
7620: 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29  lSpaces(((char*)
7630: 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d  pKey2)+n, nKey2-
7640: 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
7650: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7660: 52 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52 54  R-31624-24737 RT
7670: 52 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e 41  RIM is like BINA
7680: 52 59 20 65 78 63 65 70 74 20 74 68 61 74 20 65  RY except that e
7690: 78 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73 70  xtra.      ** sp
76a0: 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 20  aces at the end 
76b0: 6f 66 20 65 69 74 68 65 72 20 73 74 72 69 6e 67  of either string
76c0: 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
76d0: 68 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74  he result. In ot
76e0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72  her.      ** wor
76f0: 64 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c 6c  ds, strings will
7700: 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
7710: 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61 73  o one another as
7720: 20 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20 20   long as they.  
7730: 20 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e      ** differ on
7740: 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ly in the number
7750: 20 6f 66 20 73 70 61 63 65 73 20 61 74 20 74 68   of spaces at th
7760: 65 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  e end..      */.
7770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7780: 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b   rc = nKey1 - nK
7790: 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ey2;.    }.  }. 
77a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
77b0: 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69  *.** Another bui
77c0: 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20  lt-in collating 
77d0: 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45  sequence: NOCASE
77e0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  . .**.** This co
77f0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7800: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
7810: 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73  be used for "cas
7820: 65 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a  e independent.**
7830: 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51   comparison". SQ
7840: 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65  Lite's knowledge
7850: 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   of upper and lo
7860: 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c  wer case equival
7870: 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20  ents.** extends 
7880: 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63  only to the 26 c
7890: 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69  haracters used i
78a0: 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61  n the English la
78b0: 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74  nguage..**.** At
78c0: 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72   the moment ther
78d0: 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d  e is only a UTF-
78e0: 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  8 implementation
78f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7900: 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
7910: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
7920: 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
7930: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7940: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
7950: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
7960: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20  Key2.){.  int r 
7970: 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  = sqlite3StrNICm
7980: 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20  p(.      (const 
7990: 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63  char *)pKey1, (c
79a0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79  onst char *)pKey
79b0: 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29  2, (nKey1<nKey2)
79c0: 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20  ?nKey1:nKey2);. 
79d0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
79e0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  R(NotUsed);.  if
79f0: 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20  ( 0==r ){.    r 
7a00: 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20  = nKey1-nKey2;. 
7a10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
7a20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7a30: 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  he ROWID of the 
7a40: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
7a50: 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74  rt.*/.sqlite_int
7a60: 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  64 sqlite3_last_
7a70: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c  insert_rowid(sql
7a80: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
7a90: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7aa0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7ab0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7ac0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
7ad0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
7ae0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
7af0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
7b00: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
7b10: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  >lastRowid;.}../
7b20: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
7b30: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
7b40: 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  he sqlite3_last_
7b50: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41  insert_rowid() A
7b60: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
7b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 65 74  void sqlite3_set
7b80: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7b90: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
7ba0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
7bb0: 6f 77 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51  owid){.#ifdef SQ
7bc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7bd0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
7be0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
7bf0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
7c00: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
7c10: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7c20: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
7c30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
7c40: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
7c50: 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20    db->lastRowid 
7c60: 3d 20 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69  = iRowid;.  sqli
7c70: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7c80: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  db->mutex);.}../
7c90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7ca0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
7cb0: 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  s in the most re
7cc0: 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
7cd0: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a  ite3_exec()..*/.
7ce0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  int sqlite3_chan
7cf0: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
7d00: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
7d10: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
7d20: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
7d30: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
7d40: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
7d50: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
7d60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7d70: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
7d80: 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b  urn db->nChange;
7d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7da0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
7db0: 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65  hanges since the
7dc0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7dd0: 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a   was opened..*/.
7de0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  int sqlite3_tota
7df0: 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  l_changes(sqlite
7e00: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7e10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
7e20: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
7e30: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
7e40: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
7e50: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
7e60: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
7e70: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7e80: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54  .  return db->nT
7e90: 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  otalChange;.}../
7ea0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f  *.** Close all o
7eb0: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
7ec0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  This function on
7ed0: 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66  ly manipulates f
7ee0: 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20  ields of the.** 
7ef0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7f00: 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20  object, it does 
7f10: 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61  not close any sa
7f20: 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61  vepoints that ma
7f30: 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20  y be open.** at 
7f40: 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72  the b-tree/pager
7f50: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20   level..*/.void 
7f60: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
7f70: 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  points(sqlite3 *
7f80: 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62  db){.  while( db
7f90: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->pSavepoint ){.
7fa0: 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70      Savepoint *p
7fb0: 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  Tmp = db->pSavep
7fc0: 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53  oint;.    db->pS
7fd0: 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d  avepoint = pTmp-
7fe0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
7ff0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
8000: 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e  mp);.  }.  db->n
8010: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
8020: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
8030: 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61  = 0;.  db->isTra
8040: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
8050: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
8060: 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  Invoke the destr
8070: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61  uctor function a
8080: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46  ssociated with F
8090: 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79  uncDef p, if any
80a0: 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20  . Except,.** if 
80b0: 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
80c0: 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65  last copy of the
80d0: 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f   function, do no
80e0: 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c  t invoke it. Mul
80f0: 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20  tiple.** copies 
8100: 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63  of a single func
8110: 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64  tion are created
8120: 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e   when create_fun
8130: 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65  ction() is calle
8140: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
8150: 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f  _ANY as the enco
8160: 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ding..*/.static 
8170: 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73  void functionDes
8180: 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62  troy(sqlite3 *db
8190: 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20  , FuncDef *p){. 
81a0: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
81b0: 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  *pDestructor = p
81c0: 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 3b  ->u.pDestructor;
81d0: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
81e0: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
81f0: 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  uctor->nRef--;. 
8200: 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74     if( pDestruct
8210: 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  or->nRef==0 ){. 
8220: 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72       pDestructor
8230: 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74  ->xDestroy(pDest
8240: 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74  ructor->pUserDat
8250: 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
8260: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73  3DbFree(db, pDes
8270: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
8280: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73    }.}../*.** Dis
8290: 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69  connect all sqli
82a0: 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73  te3_vtab objects
82b0: 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
82c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
82d0: 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20  ion.** db. This 
82e0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64  is called when d
82f0: 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65  b is being close
8300: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8310: 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  d disconnectAllV
8320: 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tab(sqlite3 *db)
8330: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
8340: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8350: 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61  LE.  int i;.  Ha
8360: 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c  shElem *p;.  sql
8370: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
8380: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
8390: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
83a0: 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ){.    Schema *p
83b0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
83c0: 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [i].pSchema;.   
83d0: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
83e0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
83f0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
8400: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
8410: 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d  >tblHash); p; p=
8420: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
8430: 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  )){.        Tabl
8440: 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65  e *pTab = (Table
8450: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
8460: 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  a(p);.        if
8470: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
8480: 29 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44  ) ) sqlite3VtabD
8490: 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54  isconnect(db, pT
84a0: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
84b0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73   }.  }.  for(p=s
84c0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
84d0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b  db->aModule); p;
84e0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
84f0: 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(p)){.    Modul
8500: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
8510: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
8520: 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(p);.    if( p
8530: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a  Mod->pEpoTab ){.
8540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
8550: 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  bDisconnect(db, 
8560: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a  pMod->pEpoTab);.
8570: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
8580: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
8590: 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  t(db);.  sqlite3
85a0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
85b0: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
85c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
85d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
85e0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
85f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8600: 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e  ion db has unfin
8610: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
8620: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
8630: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
8640: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8650: 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ts.  .*/.static 
8660: 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73  int connectionIs
8670: 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62  Busy(sqlite3 *db
8680: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
8690: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
86a0: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
86b0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ex) );.  if( db-
86c0: 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20  >pVdbe ) return 
86d0: 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  1;.  for(j=0; j<
86e0: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
86f0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8700: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a  db->aDb[j].pBt;.
8710: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
8720: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42  qlite3BtreeIsInB
8730: 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74  ackup(pBt) ) ret
8740: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
8750: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8760: 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Close an existin
8770: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
8780: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
8790: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c  sqlite3Close(sql
87a0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f  ite3 *db, int fo
87b0: 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66  rceZombie){.  if
87c0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20  ( !db ){.    /* 
87d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
87e0: 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c 69  3257-11740 Calli
87f0: 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  ng sqlite3_close
8800: 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  () or.    ** sql
8810: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20  ite3_close_v2() 
8820: 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  with a NULL poin
8830: 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ter argument is 
8840: 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
8850: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
8860: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
8870: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
8880: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
8890: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
88a0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
88b0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
88c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
88d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
88e0: 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 20  f( db->mTrace & 
88f0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
8900: 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54  SE ){.    db->xT
8910: 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43  race(SQLITE_TRAC
8920: 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72  E_CLOSE, db->pTr
8930: 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a  aceArg, db, 0);.
8940: 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20    }..  /* Force 
8950: 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c  xDisconnect call
8960: 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c  s on all virtual
8970: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73   tables */.  dis
8980: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64  connectAllVtab(d
8990: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  b);..  /* If a t
89a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
89b0: 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65  en, the disconne
89c0: 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c  ctAllVtab() call
89d0: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
89e0: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
89f0: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
8a00: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
8a10: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
8a20: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
8a30: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
8a40: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
8a50: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
8a60: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
8a70: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
8a80: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
8a90: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
8aa0: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
8ab0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
8ac0: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
8ad0: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
8ae0: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
8af0: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
8b00: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
8b10: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
8b20: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
8b30: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
8b40: 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f  * Legacy behavio
8b50: 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  r (sqlite3_close
8b60: 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20  () behavior) is 
8b70: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
8b80: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68  QLITE_BUSY if th
8b90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
8ba0: 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69   not be closed i
8bb0: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
8bc0: 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d  .  if( !forceZom
8bd0: 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f  bie && connectio
8be0: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
8bf0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
8c00: 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
8c10: 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20  E_BUSY, "unable 
8c20: 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20  to close due to 
8c30: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20  unfinalized ".  
8c40: 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73       "statements
8c50: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62   or unfinished b
8c60: 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71  ackups");.    sq
8c70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
8c80: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8c90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8ca0: 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  BUSY;.  }..#ifde
8cb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8cc0: 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
8cd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
8ce0: 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
8cf0: 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68  /* Closing the h
8d00: 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
8d10: 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
8d20: 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a  d the value 2. *
8d30: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  /.    sqlite3Glo
8d40: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
8d50: 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g(sqlite3GlobalC
8d60: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
8d70: 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d  , db, 0, 2);.  }
8d80: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
8d90: 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63  nvert the connec
8da0: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62  tion into a zomb
8db0: 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73  ie and then clos
8dc0: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d  e it..  */.  db-
8dd0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
8de0: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20  MAGIC_ZOMBIE;.  
8df0: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
8e00: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
8e10: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
8e20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8e30: 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73  * Two variations
8e40: 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69   on the public i
8e50: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f  nterface for clo
8e60: 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  sing a database.
8e70: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  ** connection. T
8e80: 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  he sqlite3_close
8e90: 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72  () version retur
8ea0: 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ns SQLITE_BUSY a
8eb0: 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65  nd.** leaves the
8ec0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69   connection opti
8ed0: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
8ee0: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70  unfinalized prep
8ef0: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
8f00: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
8f10: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73   sqlite3_backups
8f20: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  .  The sqlite3_c
8f30: 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72  lose_v2().** ver
8f40: 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20  sion forces the 
8f50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
8f60: 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66  come a zombie if
8f70: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e   there are.** un
8f80: 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73  closed resources
8f90: 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66  , and arranges f
8fa0: 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  or deallocation 
8fb0: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a  when the last.**
8fc0: 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
8fd0: 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  nt or sqlite3_ba
8fe0: 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a  ckup closes..*/.
8ff0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
9000: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  e(sqlite3 *db){ 
9010: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
9020: 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74  ose(db,0); }.int
9030: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
9040: 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  2(sqlite3 *db){ 
9050: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
9060: 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f  ose(db,1); }.../
9070: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d  *.** Close the m
9080: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
9090: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
90a0: 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  **.** Furthermor
90b0: 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63  e, if database c
90c0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
90d0: 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e  a zombie (meanin
90e0: 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  g that there.** 
90f0: 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72  has been a prior
9100: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9110: 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71  _close(db) or sq
9120: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64  lite3_close_v2(d
9130: 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79  b)) and.** every
9140: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61   sqlite3_stmt ha
9150: 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c  s now been final
9160: 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73  ized and every s
9170: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61  qlite3_backup ha
9180: 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74  s.** finished, t
9190: 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73  hen free all res
91a0: 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ources..*/.void 
91b0: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
91c0: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
91d0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
91e0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20  HashElem *i;    
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74  /* Hash table it
9210: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
9220: 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  j;..  /* If ther
9230: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
9240: 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  g sqlite3_stmt o
9250: 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  r sqlite3_backup
9260: 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72   objects.  ** or
9270: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
9280: 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  on has not yet b
9290: 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71  een closed by sq
92a0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
92b0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74  ,.  ** then just
92c0: 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78   leave the mutex
92d0: 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
92e0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  /.  if( db->magi
92f0: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
9300: 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63  ZOMBIE || connec
9310: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
9320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
9330: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9340: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
9350: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
9360: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
9370: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
9380: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
9390: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20  onnection has.  
93a0: 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71  ** closed all sq
93b0: 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73  lite3_stmt and s
93c0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
93d0: 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65  jects and has be
93e0: 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74  en.  ** passed t
93f0: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20  o sqlite3_close 
9400: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74  (meaning that it
9410: 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20   is a zombie).  
9420: 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20  Therefore,.  ** 
9430: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65  go ahead and fre
9440: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
9450: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  .  */..  /* If a
9460: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
9470: 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61  open, roll it ba
9480: 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e  ck. This also en
9490: 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20  sures that if.  
94a0: 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  ** any database 
94b0: 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65  schemas have bee
94c0: 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e  n modified by an
94d0: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61   uncommitted tra
94e0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68  nsaction.  ** th
94f0: 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e  ey are reset. An
9500: 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69  d that the requi
9510: 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
9520: 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65   is held to make
9530: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20  .  ** the pager 
9540: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
9550: 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f  ema reset an ato
9560: 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a  mic operation. *
9570: 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  /.  sqlite3Rollb
9580: 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
9590: 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  E_OK);..  /* Fre
95a0: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
95b0: 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  g Savepoint stru
95c0: 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c  ctures. */.  sql
95d0: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
95e0: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43  nts(db);..  /* C
95f0: 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73  lose all databas
9600: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
9610: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
9620: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
9630: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
9640: 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20  = &db->aDb[j];. 
9650: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
9660: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9670: 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e  BtreeClose(pDb->
9680: 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  pBt);.      pDb-
9690: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >pBt = 0;.      
96a0: 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20  if( j!=1 ){.    
96b0: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
96c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
96d0: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65    }.  }.  /* Cle
96e0: 61 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65  ar the TEMP sche
96f0: 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e  ma separately an
9700: 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20  d last */.  if( 
9710: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
9720: 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ma ){.    sqlite
9730: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d  3SchemaClear(db-
9740: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
9750: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
9760: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
9770: 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70  );..  /* Free up
9780: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75   the array of au
9790: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
97a0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f  s */.  sqlite3Co
97b0: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
97c0: 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72  ray(db);.  asser
97d0: 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b  t( db->nDb<=2 );
97e0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
97f0: 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db==db->aDbStati
9800: 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20  c );..  /* Tell 
9810: 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69  the code in noti
9820: 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f  fy.c that the co
9830: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67  nnection no long
9840: 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a  er holds any.  *
9850: 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73  * locks and does
9860: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
9870: 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d   further unlock-
9880: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
9890: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
98a0: 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64  ConnectionClosed
98b0: 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73  (db);..  for(i=s
98c0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
98d0: 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69  db->aFunc); i; i
98e0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
98f0: 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  i)){.    FuncDef
9900: 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20   *pNext, *p;.   
9910: 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44   p = sqliteHashD
9920: 61 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a  ata(i);.    do{.
9930: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65        functionDe
9940: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20  stroy(db, p);.  
9950: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
9960: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
9970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
9980: 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78  ;.      p = pNex
9990: 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  t;.    }while( p
99a0: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
99b0: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
99c0: 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d  aFunc);.  for(i=
99d0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
99e0: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
99f0: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9a00: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c  ext(i)){.    Col
9a10: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
9a20: 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48  ollSeq *)sqliteH
9a30: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
9a40: 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65  /* Invoke any de
9a50: 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74  structors regist
9a60: 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69  ered for collati
9a70: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72  on sequence user
9a80: 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f   data. */.    fo
9a90: 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
9aa0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  {.      if( pCol
9ab0: 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20  l[j].xDel ){.   
9ac0: 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44       pColl[j].xD
9ad0: 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65  el(pColl[j].pUse
9ae0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
9af0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
9b00: 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a  ree(db, pColl);.
9b10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
9b20: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c  hClear(&db->aCol
9b30: 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
9b40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9b50: 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d  ALTABLE.  for(i=
9b60: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9b70: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69  &db->aModule); i
9b80: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9b90: 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(i)){.    Modu
9ba0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
9bb0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
9bc0: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
9bd0: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29  pMod->xDestroy )
9be0: 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44  {.      pMod->xD
9bf0: 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75  estroy(pMod->pAu
9c00: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  x);.    }.    sq
9c10: 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f  lite3VtabEponymo
9c20: 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62 2c  usTableClear(db,
9c30: 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69   pMod);.    sqli
9c40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d  te3DbFree(db, pM
9c50: 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  od);.  }.  sqlit
9c60: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
9c70: 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
9c80: 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  f..  sqlite3Erro
9c90: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
9ca0: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
9cb0: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
9cc0: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
9cd0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
9ce0: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71  (db->pErr);.  sq
9cf0: 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73  lite3CloseExtens
9d00: 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51  ions(db);.#if SQ
9d10: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
9d20: 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74  TICATION.  sqlit
9d30: 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68  e3_free(db->auth
9d40: 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73  .zAuthUser);.  s
9d50: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9d60: 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23  auth.zAuthPW);.#
9d70: 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67  endif..  db->mag
9d80: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
9d90: 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54  C_ERROR;..  /* T
9da0: 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65  he temp-database
9db0: 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63   schema is alloc
9dc0: 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  ated differently
9dd0: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20   from the other 
9de0: 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65  schema.  ** obje
9df0: 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74  cts (using sqlit
9e00: 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74  eMalloc() direct
9e10: 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ly, instead of s
9e20: 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
9e30: 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74  a())..  ** So it
9e40: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
9e50: 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57  ed here. Todo: W
9e60: 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20  hy not roll the 
9e70: 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f  temp schema into
9e80: 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73  .  ** the same s
9e90: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73  qliteMalloc() as
9ea0: 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c   the one that al
9eb0: 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61  locates the data
9ec0: 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63  base .  ** struc
9ed0: 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c  ture?.  */.  sql
9ee0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
9ef0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9f00: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  a);.  sqlite3_mu
9f10: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9f20: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69  tex);.  db->magi
9f30: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
9f40: 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74  _CLOSED;.  sqlit
9f50: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62  e3_mutex_free(db
9f60: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
9f70: 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 6f 6b 61  rt( sqlite3Looka
9f80: 73 69 64 65 55 73 65 64 28 64 62 2c 30 29 3d 3d  sideUsed(db,0)==
9f90: 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c  0 );.  if( db->l
9fa0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
9fb0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
9fc0: 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61  3_free(db->looka
9fd0: 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20  side.pStart);.  
9fe0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
9ff0: 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  (db);.}../*.** R
a000: 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61  ollback all data
a010: 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20  base files.  If 
a020: 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
a030: 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a  SQLITE_OK, then.
a040: 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63 75 72  ** any write cur
a050: 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
a060: 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20  ated ("tripped" 
a070: 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e  - as in "trippin
a080: 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62  g a circuit.** b
a090: 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64  reaker") and mad
a0a0: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70  e to return trip
a0b0: 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72  Code if there ar
a0c0: 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a  e any further.**
a0d0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65   attempts to use
a0e0: 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52   that cursor.  R
a0f0: 65 61 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61  ead cursors rema
a100: 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69  in open and vali
a110: 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61  d.** but are "sa
a120: 76 65 64 22 20 69 6e 20 63 61 73 65 20 74 68 65  ved" in case the
a130: 20 74 61 62 6c 65 20 70 61 67 65 73 20 61 72 65   table pages are
a140: 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a   moved around..*
a150: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
a160: 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65  llbackAll(sqlite
a170: 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43  3 *db, int tripC
a180: 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ode){.  int i;. 
a190: 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30   int inTrans = 0
a1a0: 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68  ;.  int schemaCh
a1b0: 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  ange;.  assert( 
a1c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a1d0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
a1e0: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
a1f0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
a200: 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20    /* Obtain all 
a210: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62  b-tree mutexes b
a220: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79  efore making any
a230: 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52   calls to BtreeR
a240: 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a  ollback(). .  **
a250: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
a260: 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  nt in case the t
a270: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
a280: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73   rolled back has
a290: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
a2a0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
a2b0: 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  ma. If the b-tre
a2c0: 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f  e mutexes are no
a2d0: 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72  t taken.  ** her
a2e0: 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20  e, then another 
a2f0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e  shared-cache con
a300: 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e  nection might sn
a310: 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20  eak in between. 
a320: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
a330: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
a340: 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63  hema reset, whic
a350: 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73  h can cause fals
a360: 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f  e.  ** corruptio
a370: 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d  n reports in som
a380: 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73  e cases.  */.  s
a390: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
a3a0: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d  All(db);.  schem
a3b0: 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d  aChange = (db->m
a3c0: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
a3d0: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d  _SchemaChange)!=
a3e0: 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 && db->init.bu
a3f0: 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  sy==0;..  for(i=
a400: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
a410: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
a420: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
a430: 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  t;.    if( p ){.
a440: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a450: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
a460: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p) ){.        in
a470: 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  Trans = 1;.     
a480: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a490: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
a4a0: 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63 68 65   tripCode, !sche
a4b0: 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d  maChange);.    }
a4c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
a4d0: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
a4e0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
a4f0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69  gnMalloc();..  i
a500: 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  f( (db->mDbFlags
a510: 26 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68  &DBFLAG_SchemaCh
a520: 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62 2d 3e  ange)!=0 && db->
a530: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
a540: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
a550: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
a560: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  nts(db);.    sql
a570: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
a580: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
a590: 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
a5a0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
a5b0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64  db);..  /* Any d
a5c0: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
a5d0: 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61  nt violations ha
a5e0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f  ve now been reso
a5f0: 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e  lved. */.  db->n
a600: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
a610: 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  ;.  db->nDeferre
a620: 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
a630: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
a640: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a  LITE_DeferFKs;..
a650: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20    /* If one has 
a660: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
a670: 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c   invoke the roll
a680: 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61  back-hook callba
a690: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ck */.  if( db->
a6a0: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
a6b0: 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c  k && (inTrans ||
a6c0: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
a6d0: 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f  ) ){.    db->xRo
a6e0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64  llbackCallback(d
a6f0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29  b->pRollbackArg)
a700: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
a710: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
a720: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
a730: 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73   the name corres
a740: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65  ponding to the e
a750: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65  rror code.** spe
a760: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72  cified in the ar
a770: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64  gument..*/.#if d
a780: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45  efined(SQLITE_NE
a790: 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e  ED_ERR_NAME).con
a7a0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
a7b0: 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b  ErrName(int rc){
a7c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a7d0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
a7e0: 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a  i, origRc = rc;.
a7f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26    for(i=0; i<2 &
a800: 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c  & zName==0; i++,
a810: 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20   rc &= 0xff){.  
a820: 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a    switch( rc ){.
a830: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a840: 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20  E_OK:           
a850: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a860: 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20  QLITE_OK";      
a870: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a880: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a890: 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20  TE_ERROR:       
a8a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a8b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20  SQLITE_ERROR";  
a8c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a8d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a8e0: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20  ITE_INTERNAL:   
a8f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a900: 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c  "SQLITE_INTERNAL
a910: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
a920: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a930: 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20  LITE_PERM:      
a940: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a950: 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20   "SQLITE_PERM"; 
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a970: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a980: 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20  QLITE_ABORT:    
a990: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a9a0: 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22  = "SQLITE_ABORT"
a9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
a9c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a9d0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
a9e0: 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65  LBACK:     zName
a9f0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
aa00: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62  _ROLLBACK";    b
aa10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aa20: 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20   SQLITE_BUSY:   
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
aa40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
aa50: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
aa60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aa70: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
aa80: 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61  COVERY:      zNa
aa90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
aaa0: 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20  Y_RECOVERY";    
aab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aac0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53  se SQLITE_BUSY_S
aad0: 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e  NAPSHOT:      zN
aae0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
aaf0: 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20  SY_SNAPSHOT";   
ab00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ab10: 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ase SQLITE_LOCKE
ab20: 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  D:             z
ab30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c  Name = "SQLITE_L
ab40: 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20  OCKED";         
ab50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ab60: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
ab70: 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20  ED_SHAREDCACHE: 
ab80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ab90: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
aba0: 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  HE";break;.     
abb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d   case SQLITE_NOM
abc0: 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  EM:             
abd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
abe0: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20  _NOMEM";        
abf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
ac10: 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20  ADONLY:         
ac20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac30: 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20  E_READONLY";    
ac40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
ac60: 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59  EADONLY_RECOVERY
ac70: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
ac80: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f  TE_READONLY_RECO
ac90: 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VERY"; break;.  
aca0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
acb0: 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43  READONLY_CANTLOC
acc0: 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  K:  zName = "SQL
acd0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
ace0: 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  TLOCK"; break;. 
acf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ad00: 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
ad10: 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CK:  zName = "SQ
ad20: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
ad30: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
ad40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad50: 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
ad60: 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ED:   zName = "S
ad70: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
ad80: 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b  BMOVED";  break;
ad90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ada0: 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20  TE_INTERRUPT:   
adb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
adc0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
add0: 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";         break
ade0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
adf0: 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20  ITE_IOERR:      
ae00: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ae10: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20  "SQLITE_IOERR"; 
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ae30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae40: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a  LITE_IOERR_READ:
ae50: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ae60: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
ae70: 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65  EAD";        bre
ae80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
aea0: 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20  T_READ:   zName 
aeb0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aec0: 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72  SHORT_READ";  br
aed0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aee0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
aef0: 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  TE:        zName
af00: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
af10: 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62  _WRITE";       b
af20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
af30: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
af40: 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  YNC:        zNam
af50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
af60: 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20  R_FSYNC";       
af70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
af80: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
af90: 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61  IR_FSYNC:    zNa
afa0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
afb0: 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20  RR_DIR_FSYNC";  
afc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
afd0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
afe0: 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e  TRUNCATE:     zN
aff0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b000: 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20  ERR_TRUNCATE";  
b010: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b020: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b030: 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a  _FSTAT:        z
b040: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b050: 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20  OERR_FSTAT";    
b060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b070: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b080: 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_UNLOCK:       
b090: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b0a0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20  IOERR_UNLOCK";  
b0b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b0c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b0d0: 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20  RR_RDLOCK:      
b0e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b0f0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20  _IOERR_RDLOCK"; 
b100: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b110: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b120: 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20  ERR_DELETE:     
b130: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b140: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b  E_IOERR_DELETE";
b150: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b160: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b170: 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  OERR_NOMEM:     
b180: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b  TE_IOERR_NOMEM";
b1a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b1b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1c0: 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20  IOERR_ACCESS:   
b1d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b1e0: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
b1f0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b200: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b210: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
b220: 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  RVEDLOCK:.      
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b240: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b250: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b260: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
b270: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
b280: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b290: 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20  RR_LOCK:        
b2a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b2b0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20  _IOERR_LOCK";   
b2c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b2d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b2e0: 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20  ERR_CLOSE:      
b2f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b300: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20  E_IOERR_CLOSE"; 
b310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b320: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b330: 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20  OERR_DIR_CLOSE: 
b340: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b350: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
b360: 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  SE";   break;.  
b370: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b380: 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20  IOERR_SHMOPEN:  
b390: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b3a0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
b3b0: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
b3c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b3d0: 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20  _IOERR_SHMSIZE: 
b3e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b3f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
b400: 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ZE";     break;.
b410: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b420: 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a  E_IOERR_SHMLOCK:
b430: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b440: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
b450: 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  OCK";     break;
b460: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b470: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a  TE_IOERR_SHMMAP:
b480: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b490: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b4a0: 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b  MAP";      break
b4b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b4c0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20  ITE_IOERR_SEEK: 
b4d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b4e0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  "SQLITE_IOERR_SE
b4f0: 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  EK";        brea
b500: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b510: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
b520: 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d  E_NOENT: zName =
b530: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
b540: 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65  ELETE_NOENT";bre
b550: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b560: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
b570: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
b580: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b590: 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72  MMAP";        br
b5a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b5b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
b5c0: 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65  TEMPPATH:  zName
b5d0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b5e0: 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62  _GETTEMPPATH"; b
b5f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b600: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f   SQLITE_IOERR_CO
b610: 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d  NVPATH:     zNam
b620: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b630: 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20  R_CONVPATH";    
b640: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b650: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
b660: 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  :            zNa
b670: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
b680: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20  RUPT";          
b690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b6a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
b6b0: 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e  T_VTAB:       zN
b6c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b6d0: 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20  RRUPT_VTAB";    
b6e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b6f0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  ase SQLITE_NOTFO
b700: 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a  UND:           z
b710: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
b720: 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20  OTFOUND";       
b730: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b740: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c  case SQLITE_FULL
b750: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
b760: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b770: 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20  FULL";          
b780: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b790: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
b7a0: 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20  TOPEN:          
b7b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b7c0: 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20  _CANTOPEN";     
b7d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b7e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b7f0: 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52  NTOPEN_NOTEMPDIR
b800: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
b810: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
b820: 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20  PDIR";break;.   
b830: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b840: 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20  ANTOPEN_ISDIR:  
b850: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b860: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
b870: 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  R";    break;.  
b880: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b890: 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
b8a0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
b8b0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
b8c0: 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  LPATH"; break;. 
b8d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b8e0: 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
b8f0: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
b900: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
b910: 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  NVPATH"; break;.
b920: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b930: 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20  E_PROTOCOL:     
b940: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b950: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b  QLITE_PROTOCOL";
b960: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b970: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b980: 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20  TE_EMPTY:       
b990: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b9a0: 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20  SQLITE_EMPTY";  
b9b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b9c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b9d0: 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20  ITE_SCHEMA:     
b9e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b9f0: 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b  "SQLITE_SCHEMA";
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ba10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ba20: 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20  LITE_TOOBIG:    
ba30: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ba40: 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22   "SQLITE_TOOBIG"
ba50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
ba60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ba70: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
ba80: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
ba90: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
baa0: 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72  AINT";        br
bab0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bac0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bad0: 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65  T_UNIQUE:  zName
bae0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
baf0: 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62  RAINT_UNIQUE"; b
bb00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bb10: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
bb20: 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d  NT_TRIGGER: zNam
bb30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
bb40: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b  TRAINT_TRIGGER";
bb50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bb60: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
bb70: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a  INT_FOREIGNKEY:.
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bbb0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
bbc0: 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b  GNKEY";   break;
bbd0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bbe0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48  TE_CONSTRAINT_CH
bbf0: 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  ECK:   zName = "
bc00: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bc10: 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b  T_CHECK";  break
bc20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bc30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
bc40: 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20  RIMARYKEY:.     
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bc70: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bc80: 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
bc90: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
bca0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bcb0: 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c  NSTRAINT_NOTNULL
bcc0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
bcd0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
bce0: 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20  NULL";break;.   
bcf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bd00: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
bd10: 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  HOOK:.          
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bd40: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bd50: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20  _COMMITHOOK";   
bd60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bd70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
bd80: 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61  INT_VTAB:    zNa
bd90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
bda0: 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20  STRAINT_VTAB";  
bdb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bdc0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
bdd0: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  AINT_FUNCTION:. 
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
be00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
be10: 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49  ONSTRAINT_FUNCTI
be20: 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ON";     break;.
be30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
be40: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
be50: 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ID:   zName = "S
be60: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
be70: 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b  _ROWID";  break;
be80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be90: 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20  TE_MISMATCH:    
bea0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
beb0: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22  SQLITE_MISMATCH"
bec0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
bed0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bee0: 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20  ITE_MISUSE:     
bef0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bf00: 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b  "SQLITE_MISUSE";
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bf20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bf30: 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20  LITE_NOLFS:     
bf40: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bf50: 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b   "SQLITE_NOLFS";
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
bf70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bf80: 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20  QLITE_AUTH:     
bf90: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bfa0: 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b  = "SQLITE_AUTH";
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
bfc0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bfd0: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20  SQLITE_FORMAT:  
bfe0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bff0: 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41   = "SQLITE_FORMA
c000: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  T";            b
c010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c020: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20   SQLITE_RANGE:  
c030: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c040: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47  e = "SQLITE_RANG
c050: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  E";             
c060: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c070: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a  e SQLITE_NOTADB:
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c090: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
c0a0: 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20  ADB";           
c0b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c0c0: 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20  se SQLITE_ROW:  
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c0e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f  ame = "SQLITE_RO
c0f0: 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  W";             
c100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c110: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
c120: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
c130: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c140: 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20  OTICE";         
c150: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c160: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
c170: 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20  CE_RECOVER_WAL: 
c180: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c190: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
c1a0: 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  AL";break;.     
c1b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
c1c0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
c1d0: 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  BACK:.          
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c200: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
c210: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  OVER_ROLLBACK"; 
c220: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c230: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
c240: 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  :            zNa
c250: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
c260: 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20  NING";          
c270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c280: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
c290: 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e  G_AUTOINDEX:  zN
c2a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
c2b0: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22  RNING_AUTOINDEX"
c2c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
c2d0: 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a  ase SQLITE_DONE:
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c2f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44  Name = "SQLITE_D
c300: 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  ONE";           
c310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c320: 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d    }.  if( zName=
c330: 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
c340: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
c350: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c360: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
c370: 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45  ), zBuf, "SQLITE
c380: 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f  _UNKNOWN(%d)", o
c390: 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d  rigRc);.    zNam
c3a0: 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20  e = zBuf;.  }.  
c3b0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
c3c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
c3d0: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
c3e0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
c3f0: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
c400: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
c410: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
c420: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
c430: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
c440: 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74  (int rc){.  stat
c450: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63  ic const char* c
c460: 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a  onst aMsg[] = {.
c470: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b      /* SQLITE_OK
c480: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f            */ "no
c490: 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20  t an error",.   
c4a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   /* SQLITE_ERROR
c4b0: 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c         */ "SQL l
c4c0: 6f 67 69 63 20 65 72 72 6f 72 22 2c 0a 20 20 20  ogic error",.   
c4d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   /* SQLITE_INTER
c4e0: 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  NAL    */ 0,.   
c4f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20   /* SQLITE_PERM 
c500: 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73         */ "acces
c510: 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e  s permission den
c520: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
c530: 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20  ITE_ABORT       
c540: 2a 2f 20 22 71 75 65 72 79 20 61 62 6f 72 74 65  */ "query aborte
c550: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c560: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
c570: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
c580: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
c590: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
c5a0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
c5b0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
c5c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
c5d0: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
c5e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
c5f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
c600: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
c610: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
c620: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
c630: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c640: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
c650: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
c660: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
c670: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
c680: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
c690: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
c6a0: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
c6b0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
c6c0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
c6d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
c6e0: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
c6f0: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
c700: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
c710: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
c720: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
c730: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
c740: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
c750: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
c760: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
c770: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
c780: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
c790: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
c7a0: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
c7b0: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
c7c0: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
c7d0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
c7e0: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
c7f0: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
c800: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c810: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
c820: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
c830: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
c840: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
c850: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
c860: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
c870: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
c880: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
c890: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
c8a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
c8b0: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 62 61 64  USE      */ "bad
c8c0: 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20 6f 74   parameter or ot
c8d0: 68 65 72 20 41 50 49 20 6d 69 73 75 73 65 22 2c  her API misuse",
c8e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
c8f0: 49 53 41 42 4c 45 5f 4c 46 53 0a 20 20 20 20 2f  ISABLE_LFS.    /
c900: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
c910: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
c920: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
c930: 69 73 61 62 6c 65 64 22 2c 0a 23 65 6c 73 65 0a  isabled",.#else.
c940: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
c950: 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  LFS       */ 0,.
c960: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 53 51  #endif.    /* SQ
c970: 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20  LITE_AUTH       
c980: 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69   */ "authorizati
c990: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
c9a0: 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  /* SQLITE_FORMAT
c9b0: 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
c9c0: 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20  /* SQLITE_RANGE 
c9d0: 20 20 20 20 20 20 2a 2f 20 22 63 6f 6c 75 6d 6e        */ "column
c9e0: 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61   index out of ra
c9f0: 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nge",.    /* SQL
ca00: 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20  ITE_NOTADB      
ca10: 2a 2f 20 22 66 69 6c 65 20 69 73 20 6e 6f 74 20  */ "file is not 
ca20: 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d  a database",.  }
ca30: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
ca40: 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20  zErr = "unknown 
ca50: 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68  error";.  switch
ca60: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65  ( rc ){.    case
ca70: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
ca80: 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20  LLBACK: {.      
ca90: 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75  zErr = "abort du
caa0: 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a  e to ROLLBACK";.
cab0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cac0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
cad0: 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78  {.      rc &= 0x
cae0: 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ff;.      if( AL
caf0: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
cb00: 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67  c<ArraySize(aMsg
cb10: 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30  ) && aMsg[rc]!=0
cb20: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
cb30: 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20   = aMsg[rc];.   
cb40: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
cb50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
cb60: 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a  turn zErr;.}../*
cb70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cb80: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75   implements a bu
cb90: 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74  sy callback that
cba0: 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65   sleeps and trie
cbb0: 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c  s.** again until
cbc0: 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65   a timeout value
cbd0: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68   is reached.  Th
cbe0: 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  e timeout value 
cbf0: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
cc00: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
cc10: 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69  seconds passed i
cc20: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n as the first.*
cc30: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
cc40: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
cc50: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
cc60: 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c  ack(. void *ptr,
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc80: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
cc90: 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f  ction */. int co
cca0: 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  unt             
ccb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ccc0: 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20  times table has 
ccd0: 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a  been busy */.){.
cce0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
ccf0: 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50  N || HAVE_USLEEP
cd00: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
cd10: 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20  u8 delays[] =.  
cd20: 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30     { 1, 2, 5, 10
cd30: 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35  , 15, 20, 25, 25
cd40: 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c  ,  25,  50,  50,
cd50: 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63   100 };.  static
cd60: 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73   const u8 totals
cd70: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31  [] =.     { 0, 1
cd80: 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c  , 3,  8, 18, 33,
cd90: 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32   53, 78, 103, 12
cda0: 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23  8, 178, 228 };.#
cdb0: 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41   define NDELAY A
cdc0: 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29  rraySize(delays)
cdd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cde0: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
cdf0: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
ce00: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
ce10: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
ce20: 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rior;..  assert(
ce30: 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69   count>=0 );.  i
ce40: 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41  f( count < NDELA
ce50: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
ce60: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a   delays[count];.
ce70: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
ce80: 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c  ls[count];.  }el
ce90: 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20  se{.    delay = 
cea0: 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d  delays[NDELAY-1]
ceb0: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
cec0: 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b  tals[NDELAY-1] +
ced0: 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e   delay*(count-(N
cee0: 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20  DELAY-1));.  }. 
cef0: 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c   if( prior + del
cf00: 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  ay > timeout ){.
cf10: 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65      delay = time
cf20: 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20  out - prior;.   
cf30: 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20   if( delay<=0 ) 
cf40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cf50: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
cf60: 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31  b->pVfs, delay*1
cf70: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
cf80: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
cf90: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
cfa0: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
cfb0: 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65  meout = ((sqlite
cfc0: 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69  3 *)ptr)->busyTi
cfd0: 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f  meout;.  if( (co
cfe0: 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69  unt+1)*1000 > ti
cff0: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  meout ){.    ret
d000: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
d010: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
d020: 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a  pVfs, 1000000);.
d030: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
d040: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  if.}../*.** Invo
d050: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73  ke the given bus
d060: 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a  y handler..**.**
d070: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d080: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
d090: 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  operation failed
d0a0: 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a   with a lock..**
d0b0: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
d0c0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
d0d0: 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72  o, the lock is r
d0e0: 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a  etried.  If it.*
d0f0: 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65  * returns 0, the
d100: 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74   operation abort
d110: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  s with an SQLITE
d120: 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a  _BUSY error..*/.
d130: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  int sqlite3Invok
d140: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73  eBusyHandler(Bus
d150: 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20  yHandler *p){.  
d160: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45  int rc;.  if( NE
d170: 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e  VER(p==0) || p->
d180: 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  xFunc==0 || p->n
d190: 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20  Busy<0 ) return 
d1a0: 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75  0;.  rc = p->xFu
d1b0: 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e  nc(p->pArg, p->n
d1c0: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d  Busy);.  if( rc=
d1d0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  =0 ){.    p->nBu
d1e0: 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  sy = -1;.  }else
d1f0: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b  {.    p->nBusy++
d200: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d210: 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c; .}../*.** Thi
d220: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
d230: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
d240: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
d250: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
d260: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
d270: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
d280: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
d290: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
d2a0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a  3_busy_handler(.
d2b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
d2c0: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
d2d0: 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  id*,int),.  void
d2e0: 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66   *pArg.){.#ifdef
d2f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
d300: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
d310: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
d320: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
d330: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
d340: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
d350: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d360: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
d370: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
d380: 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a  .xFunc = xBusy;.
d390: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
d3a0: 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  r.pArg = pArg;. 
d3b0: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
d3c0: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62  .nBusy = 0;.  db
d3d0: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
d3e0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
d3f0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d400: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
d410: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
d420: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d430: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
d440: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
d450: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
d460: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
d470: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
d480: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
d490: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
d4a0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
d4b0: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
d4c0: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
d4d0: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
d4e0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
d4f0: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
d500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
d510: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
d520: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d530: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
d540: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
d550: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
d560: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
d570: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
d580: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
d590: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
d5a0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
d5b0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
d5c0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
d5d0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
d5e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d5f0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d600: 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29  ;.  if( nOps>0 )
d610: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
d620: 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b  ess = xProgress;
d630: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
d640: 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65  ssOps = (unsigne
d650: 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e  d)nOps;.    db->
d660: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70  pProgressArg = p
d670: 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Arg;.  }else{.  
d680: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
d690: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  = 0;.    db->nPr
d6a0: 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20  ogressOps = 0;. 
d6b0: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
d6c0: 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  Arg = 0;.  }.  s
d6d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d6e0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ve(db->mutex);.}
d6f0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
d700: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73  This routine ins
d710: 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20  talls a default 
d720: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61  busy handler tha
d730: 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a  t waits for the.
d740: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
d750: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
d760: 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nds before retur
d770: 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  ning 0..*/.int s
d780: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
d790: 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  out(sqlite3 *db,
d7a0: 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66   int ms){.#ifdef
d7b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
d7c0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
d7d0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
d7e0: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
d7f0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
d800: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69  BKPT;.#endif.  i
d810: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73  f( ms>0 ){.    s
d820: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
d830: 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65  ler(db, sqliteDe
d840: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
d850: 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20  k, (void*)db);. 
d860: 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f     db->busyTimeo
d870: 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65  ut = ms;.  }else
d880: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
d890: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
d8a0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
d8b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d8c0: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
d8d0: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
d8e0: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
d8f0: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
d900: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
d910: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
d920: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
d930: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d940: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d950: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d960: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 26  etyCheckOk(db) &
d970: 26 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e  & (db==0 || db->
d980: 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
d990: 47 49 43 5f 5a 4f 4d 42 49 45 29 20 29 7b 0a 20  GIC_ZOMBIE) ){. 
d9a0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
d9b0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
d9c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
d9d0: 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49  dif.  db->u1.isI
d9e0: 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a  nterrupted = 1;.
d9f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
da00: 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74  unction is exact
da10: 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  ly the same as s
da20: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
da30: 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74  nction(), except
da40: 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 64  .** that it is d
da50: 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61  esigned to be ca
da60: 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c  lled by internal
da70: 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65   code. The diffe
da80: 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74  rence is.** that
da90: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
daa0: 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f  ails in sqlite3_
dab0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
dac0: 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ), an error code
dad0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
dae0: 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61  and the mallocFa
daf0: 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65  iled flag cleare
db00: 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  d. .*/.int sqlit
db10: 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20  e3CreateFunc(.  
db20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
db30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
db40: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
db50: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
db60: 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61  .  void *pUserDa
db70: 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  ta,.  void (*xSF
db80: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
db90: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
dba0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
dbb0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
dbc0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
dbd0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
dbe0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
dbf0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
dc00: 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44  ntext*),.  FuncD
dc10: 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74  estructor *pDest
dc20: 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63  ructor.){.  Func
dc30: 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e  Def *p;.  int nN
dc40: 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72 61  ame;.  int extra
dc50: 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74  Flags;..  assert
dc60: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dc70: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
dc80: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69  );.  if( zFuncti
dc90: 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20  onName==0 ||.   
dca0: 20 20 20 28 78 53 46 75 6e 63 20 26 26 20 28 78     (xSFunc && (x
dcb0: 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29  Final || xStep))
dcc0: 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 53 46   || .      (!xSF
dcd0: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
dce0: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
dcf0: 20 20 20 20 28 21 78 53 46 75 6e 63 20 26 26 20      (!xSFunc && 
dd00: 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65  (!xFinal && xSte
dd10: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41  p)) ||.      (nA
dd20: 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51  rg<-1 || nArg>SQ
dd30: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
dd40: 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20  N_ARG) ||.      
dd50: 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71  (255<(nName = sq
dd60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a  lite3Strlen30( z
dd70: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20  FunctionName))) 
dd80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
dd90: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
dda0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
ddb0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
ddc0: 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45  STANT==SQLITE_DE
ddd0: 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20  TERMINISTIC );. 
dde0: 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e   extraFlags = en
ddf0: 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45  c &  SQLITE_DETE
de00: 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63  RMINISTIC;.  enc
de10: 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43   &= (SQLITE_FUNC
de20: 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f  _ENCMASK|SQLITE_
de30: 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66  ANY);.  .#ifndef
de40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
de50: 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  16.  /* If SQLIT
de60: 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
de70: 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
de80: 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
de90: 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
dea0: 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
deb0: 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
dec0: 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
ded0: 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
dee0: 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
def0: 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
df00: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
df10: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  rnally..  **.  *
df20: 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20  * If SQLITE_ANY 
df30: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64  is specified, ad
df40: 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73  d three versions
df50: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
df60: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73  .  ** to the has
df70: 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  h table..  */.  
df80: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
df90: 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63  UTF16 ){.    enc
dfa0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
dfb0: 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69  ATIVE;.  }else i
dfc0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41  f( enc==SQLITE_A
dfd0: 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  NY ){.    int rc
dfe0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
dff0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
e000: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
e010: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
e020: 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20  8|extraFlags,.  
e030: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
e040: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
e050: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
e060: 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ctor);.    if( r
e070: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e080: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e090: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
e0a0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
e0b0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
e0c0: 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c  16LE|extraFlags,
e0d0: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
e0e0: 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53  Data, xSFunc, xS
e0f0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
e100: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
e110: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
e120: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e130: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e140: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
e150: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23  E_UTF16BE;.  }.#
e160: 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c  else.  enc = SQL
e170: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66  ITE_UTF8;.#endif
e180: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
e190: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75  f an existing fu
e1a0: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
e1b0: 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65  overridden or de
e1c0: 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20  leted. If so,.  
e1d0: 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
e1e0: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65   active VMs, the
e1f0: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
e200: 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74  BUSY. If a funct
e210: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ion.  ** is bein
e220: 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c  g overridden/del
e230: 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61  eted but there a
e240: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
e250: 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a  , allow the.  **
e260: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f   operation to co
e270: 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c  ntinue but inval
e280: 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d  idate all precom
e290: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
e2a0: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
e2b0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
e2c0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
e2d0: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
e2e0: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  c, 0);.  if( p &
e2f0: 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  & (p->funcFlags 
e300: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
e310: 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70  CMASK)==enc && p
e320: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a  ->nArg==nArg ){.
e330: 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62      if( db->nVdb
e340: 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  eActive ){.     
e350: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
e360: 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
e370: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
e380: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
e390: 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e  /modify user-fun
e3a0: 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74  ction due to act
e3b0: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
e3c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e3d0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
e3e0: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
e3f0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
e400: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e410: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
e420: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
e430: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
e440: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
e450: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
e460: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
e470: 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a  g, (u8)enc, 1);.
e480: 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62    assert(p || db
e490: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b  ->mallocFailed);
e4a0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
e4b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e4c0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
e4d0: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
e4e0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
e4f0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
e500: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
e510: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
e520: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
e530: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
e540: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
e550: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
e560: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
e570: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
e580: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
e590: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
e5a0: 7d 0a 20 20 70 2d 3e 75 2e 70 44 65 73 74 72 75  }.  p->u.pDestru
e5b0: 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74  ctor = pDestruct
e5c0: 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61  or;.  p->funcFla
e5d0: 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61  gs = (p->funcFla
e5e0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
e5f0: 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72  _ENCMASK) | extr
e600: 61 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61  aFlags;.  testca
e610: 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  se( p->funcFlags
e620: 20 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   & SQLITE_DETERM
e630: 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e  INISTIC );.  p->
e640: 78 53 46 75 6e 63 20 3d 20 78 53 46 75 6e 63 20  xSFunc = xSFunc 
e650: 3f 20 78 53 46 75 6e 63 20 3a 20 78 53 74 65 70  ? xSFunc : xStep
e660: 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65  ;.  p->xFinalize
e670: 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e   = xFinal;.  p->
e680: 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65  pUserData = pUse
e690: 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67  rData;.  p->nArg
e6a0: 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20   = (u16)nArg;.  
e6b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e6c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
e6d0: 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74  e new user funct
e6e0: 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
e6f0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e700: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
e710: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
e720: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
e730: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
e740: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
e750: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
e760: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
e770: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
e780: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
e790: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
e7a0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e7b0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
e7c0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
e7d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
e7e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
e7f0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e800: 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63  ion_v2(db, zFunc
e810: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
e820: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20  xSFunc, xStep,. 
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d     xFinal, 0);.}
e860: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  ..int sqlite3_cr
e870: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
e880: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
e890: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e8a0: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
e8b0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
e8c0: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
e8d0: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
e8e0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e8f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e900: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
e910: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e920: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e930: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e940: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
e950: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
e960: 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28  oid (*xDestroy)(
e970: 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74  void *).){.  int
e980: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e990: 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75  OR;.  FuncDestru
e9a0: 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a  ctor *pArg = 0;.
e9b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e9c0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e9d0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
e9e0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
e9f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
ea00: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
ea10: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
ea20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ea30: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
ea40: 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b   if( xDestroy ){
ea50: 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e  .    pArg = (Fun
ea60: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71  cDestructor *)sq
ea70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
ea80: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e  o(db, sizeof(Fun
ea90: 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20  cDestructor));. 
eaa0: 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a     if( !pArg ){.
eab0: 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70        xDestroy(p
eac0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75  );.      goto ou
ead0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  t;.    }.    pAr
eae0: 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44  g->xDestroy = xD
eaf0: 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67  estroy;.    pArg
eb00: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b  ->pUserData = p;
eb10: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
eb20: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
eb30: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
eb40: 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78  nc, p, xSFunc, x
eb50: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41  Step, xFinal, pA
eb60: 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20  rg);.  if( pArg 
eb70: 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30  && pArg->nRef==0
eb80: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
eb90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
eba0: 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29  .    xDestroy(p)
ebb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
ebc0: 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ree(db, pArg);. 
ebd0: 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d   }.. out:.  rc =
ebe0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
ebf0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
ec00: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
ec10: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
ec20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
ec30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
ec40: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
ec50: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
ec60: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
ec70: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
ec80: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
ec90: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
eca0: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
ecb0: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
ecc0: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
ecd0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
ece0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
ecf0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
ed00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
ed10: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
ed20: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
ed30: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
ed40: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
ed50: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46  t rc;.  char *zF
ed60: 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  unc8;..#ifdef SQ
ed70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
ed80: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
ed90: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
eda0: 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69  k(db) || zFuncti
edb0: 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  onName==0 ) retu
edc0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
edd0: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
ede0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
edf0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ee00: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
ee10: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ee20: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
ee30: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
ee40: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
ee50: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
ee60: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
ee70: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
ee80: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
ee90: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 53   eTextRep, p, xS
eea0: 46 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e 61  Func,xStep,xFina
eeb0: 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  l,0);.  sqlite3D
eec0: 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38  bFree(db, zFunc8
eed0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
eee0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
eef0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ef00: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ef10: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
ef20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
ef30: 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61  * Declare that a
ef40: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
ef50: 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  en overloaded by
ef60: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
ef70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
ef80: 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  unction already 
ef90: 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75  exists as a regu
efa0: 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  lar global funct
efb0: 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ion, then.** thi
efc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
efd0: 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75  o-op.  If the fu
efe0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
eff0: 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61  exist, then crea
f000: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20  te.** a new one 
f010: 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f  that always thro
f020: 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  ws a run-time er
f030: 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  ror.  .**.** Whe
f040: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
f050: 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69   intend to provi
f060: 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64  de an overloaded
f070: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a   function, they.
f080: 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74  ** should call t
f090: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d  his routine to m
f0a0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f  ake sure the glo
f0b0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  bal function exi
f0c0: 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  sts..** A global
f0d0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65   function must e
f0e0: 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  xist in order fo
f0f0: 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
f100: 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f  n to work.** pro
f110: 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  perly..*/.int sq
f120: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
f130: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
f140: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
f150: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
f160: 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74  nt nArg.){.  int
f170: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f180: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f190: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
f1a0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f1b0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
f1c0: 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20   || zName==0 || 
f1d0: 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72  nArg<-2 ){.    r
f1e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
f1f0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
f200: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
f210: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f220: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
f230: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
f240: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
f250: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
f260: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
f270: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
f280: 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  nc(db, zName, nA
f290: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
f2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
f2c0: 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e  qlite3InvalidFun
f2d0: 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  ction, 0, 0, 0);
f2e0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
f2f0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
f300: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
f310: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f320: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
f330: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
f340: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
f350: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
f360: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e   trace function.
f370: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
f380: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
f390: 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a  egistered trace.
f3a0: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
f3b0: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74   .**.** A NULL t
f3c0: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  race function me
f3d0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63  ans that no trac
f3e0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
f3f0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
f400: 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74  trace is a point
f410: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
f420: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
f430: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
f440: 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61   each.** SQL sta
f450: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64  tement..*/.#ifnd
f460: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
f470: 45 50 52 45 43 41 54 45 44 0a 76 6f 69 64 20 2a  EPRECATED.void *
f480: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
f490: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 28  lite3 *db, void(
f4a0: 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
f4b0: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
f4c0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
f4d0: 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
f4e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f4f0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f500: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f510: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
f520: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
f530: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
f540: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
f550: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f560: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f570: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
f580: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
f590: 2d 3e 6d 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->mTrace = xTrac
f5a0: 65 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 43 45  e ? SQLITE_TRACE
f5b0: 5f 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20 20 64  _LEGACY : 0;.  d
f5c0: 62 2d 3e 78 54 72 61 63 65 20 3d 20 28 69 6e 74  b->xTrace = (int
f5d0: 28 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f  (*)(u32,void*,vo
f5e0: 69 64 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61 63  id*,void*))xTrac
f5f0: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
f600: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
f610: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f620: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f630: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65  eturn pOld;.}.#e
f640: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f650: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a  MIT_DEPRECATED *
f660: 2f 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61  /../* Register a
f670: 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
f680: 75 73 69 6e 67 20 74 68 65 20 76 65 72 73 69 6f  using the versio
f690: 6e 2d 32 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  n-2 interface..*
f6a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 72  /.int sqlite3_tr
f6b0: 61 63 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ace_v2(.  sqlite
f6c0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 2f 2a 20 54 72 61 63 65 20 74 68       /* Trace th
f6f0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  is connection */
f700: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 72 61  .  unsigned mTra
f710: 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f730: 20 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74 73 20   Mask of events 
f740: 74 6f 20 62 65 20 74 72 61 63 65 64 20 2a 2f 0a  to be traced */.
f750: 20 20 69 6e 74 28 2a 78 54 72 61 63 65 29 28 75    int(*xTrace)(u
f760: 6e 73 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f  nsigned,void*,vo
f770: 69 64 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20  id*,void*),  /* 
f780: 43 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f  Callback to invo
f790: 6b 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  ke */.  void *pA
f7a0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f     /* Context */
f7d0: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
f7e0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f7f0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f800: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f810: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
f820: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
f830: 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
f840: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f850: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
f860: 3b 0a 20 20 69 66 28 20 6d 54 72 61 63 65 3d 3d  ;.  if( mTrace==
f870: 30 20 29 20 78 54 72 61 63 65 20 3d 20 30 3b 0a  0 ) xTrace = 0;.
f880: 20 20 69 66 28 20 78 54 72 61 63 65 3d 3d 30 20    if( xTrace==0 
f890: 29 20 6d 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  ) mTrace = 0;.  
f8a0: 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72  db->mTrace = mTr
f8b0: 61 63 65 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  ace;.  db->xTrac
f8c0: 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62  e = xTrace;.  db
f8d0: 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
f8e0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
f8f0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f900: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
f910: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
f920: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f930: 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
f940: 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f  * Register a pro
f950: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  file function.  
f960: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
f970: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
f980: 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66  istered .** prof
f990: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ile function is 
f9a0: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
f9b0: 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65  * A NULL profile
f9c0: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
f9d0: 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e  that no profilin
f9e0: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
f9f0: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72  A non-NULL.** pr
fa00: 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74  ofile is a point
fa10: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
fa20: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
fa30: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
fa40: 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51  on of.** each SQ
fa50: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
fa60: 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64   is run..*/.void
fa70: 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c   *sqlite3_profil
fa80: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
fa90: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66  ,.  void (*xProf
faa0: 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ile)(void*,const
fab0: 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69   char*,sqlite_ui
fac0: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
fad0: 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Arg.){.  void *p
fae0: 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
faf0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
fb00: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
fb10: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
fb20: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
fb30: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
fb40: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
fb50: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
fb60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fb70: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
fb80: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50  .  pOld = db->pP
fb90: 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d  rofileArg;.  db-
fba0: 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f  >xProfile = xPro
fbb0: 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f  file;.  db->pPro
fbc0: 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  fileArg = pArg;.
fbd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fbe0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
fbf0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
fc00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
fc10: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
fc20: 54 45 44 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  TED */.#endif /*
fc30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
fc40: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  CE */../*.** Reg
fc50: 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e  ister a function
fc60: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77   to be invoked w
fc70: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
fc80: 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66  n commits..** If
fc90: 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e   the invoked fun
fca0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
fcb0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
fcc0: 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20   commit becomes 
fcd0: 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  a.** rollback..*
fce0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
fcf0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73  commit_hook(.  s
fd00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
fd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
fd20: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
fd30: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
fd40: 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
fd50: 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46  k)(void*),  /* F
fd60: 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b  unction to invok
fd70: 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74  e on each commit
fd80: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
fdb0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
fdc0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
fdd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fde0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
fdf0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
fe00: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
fe10: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
fe20: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
fe30: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
fe40: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
fe50: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fe60: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
fe70: 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
fe80: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
fe90: 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
fea0: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
feb0: 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
fec0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fed0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
fee0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
fef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
ff00: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
ff10: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
ff20: 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
ff30: 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
ff40: 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
ff50: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
ff60: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
ff70: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
ff80: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  _update_hook(.  
ff90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
ffa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
ffb0: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
ffc0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
ffd0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
ffe0: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
fff0: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72  har const *,char
10000 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f   const *,sqlite_
10010 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
10020 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
10030 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
10040 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
10050 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
10060 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  et;..#ifdef SQLI
10070 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10080 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10090 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
100a0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
100b0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
100c0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
100d0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
100e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
100f0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10100 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
10110 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
10120 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
10130 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
10140 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
10150 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
10160 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
10170 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10180 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
10190 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
101a0 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
101b0 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
101c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
101d0 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
101e0 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
101f0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
10200 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
10210 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
10220 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10230 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
10240 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
10250 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
10260 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
10270 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
10280 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
10290 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
102a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
102b0 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
102c0 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
102d0 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64  oid *pRet;..#ifd
102e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
102f0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
10300 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
10310 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
10320 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
10330 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
10340 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
10350 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
10360 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
10370 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
10380 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
10390 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  ;.  db->xRollbac
103a0 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  kCallback = xCal
103b0 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f  lback;.  db->pRo
103c0 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67  llbackArg = pArg
103d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
103e0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
103f0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
10400 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  t;.}..#ifdef SQL
10410 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
10420 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20  DATE_HOOK./*.** 
10430 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
10440 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
10450 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
10460 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
10470 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
10480 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
10490 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
104a0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
104b0 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
104c0 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
104d0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
104e0 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
104f0 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
10500 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28  abase */.  void(
10510 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20  *xCallback)(    
10520 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b       /* Callback
10530 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
10540 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c   void*,sqlite3*,
10550 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c  int,char const*,
10560 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69  char const*,sqli
10570 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65  te3_int64,sqlite
10580 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  3_int64),.  void
10590 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
105a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
105b0 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
105c0 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
105d0 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
105e0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
105f0 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
10600 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
10610 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64  g;.  db->xPreUpd
10620 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ateCallback = xC
10630 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
10640 50 72 65 55 70 64 61 74 65 41 72 67 20 3d 20 70  PreUpdateArg = p
10650 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
10660 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
10670 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10680 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
10690 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
106a0 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
106b0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
106c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
106d0 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
106e0 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
106f0 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
10700 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
10710 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
10720 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
10730 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
10740 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
10750 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
10760 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
10770 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
10780 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
10790 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
107a0 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
107b0 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
107c0 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
107d0 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
107e0 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
107f0 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
10800 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
10810 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
10820 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
10830 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
10840 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
10850 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
10860 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
10870 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
10880 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
10890 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
108a0 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
108b0 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
108c0 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
108d0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
108e0 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
108f0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
10900 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
10910 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
10920 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
10930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10940 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10950 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
10960 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
10970 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
10980 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
10990 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
109a0 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
109b0 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
109c0 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
109d0 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
109e0 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
109f0 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
10a00 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
10a10 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
10a20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
10a30 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
10a40 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
10a50 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
10a60 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
10a70 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
10a80 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
10a90 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
10aa0 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
10ab0 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
10ac0 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
10ad0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
10ae0 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
10af0 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
10b00 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
10b10 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
10b20 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
10b30 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
10b40 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
10b50 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
10b60 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
10b70 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
10b80 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
10b90 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
10ba0 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
10bb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
10bc0 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
10bd0 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
10be0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10bf0 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
10c00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10c10 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
10c20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
10c30 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
10c40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
10c50 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
10c60 64 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  dif.  if( nFrame
10c70 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
10c80 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73  3_wal_hook(db, s
10c90 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
10ca0 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54  Hook, SQLITE_INT
10cb0 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29  _TO_PTR(nFrame))
10cc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
10cd0 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
10ce0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23  db, 0, 0);.  }.#
10cf0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
10d00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10d10 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
10d20 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
10d30 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
10d40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10d50 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
10d60 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d  the write-ahead-
10d70 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61  log by this data
10d80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
10d90 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
10da0 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71  3_wal_hook(.  sq
10db0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10dd0 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
10de0 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64   to this db hand
10df0 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61  le */.  int(*xCa
10e00 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20  llback)(void *, 
10e10 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20  sqlite3*, const 
10e20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76  char*, int),.  v
10e30 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e50 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
10e60 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c   passed to xCall
10e70 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66  back() */.){.#if
10e80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10e90 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65  _WAL.  void *pRe
10ea0 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
10eb0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10ec0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10ed0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
10ee0 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
10ef0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10f00 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
10f10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
10f20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10f30 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10f40 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41  pRet = db->pWalA
10f50 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61  rg;.  db->xWalCa
10f60 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
10f70 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72  ck;.  db->pWalAr
10f80 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
10f90 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10fa0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10fb0 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65  turn pRet;.#else
10fc0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
10fd0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  dif.}../*.** Che
10fe0 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
10ff0 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   zDb..*/.int sql
11000 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
11010 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  int_v2(.  sqlite
11020 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
11030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
11040 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
11050 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
11060 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
11070 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74    /* Name of att
11080 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28  ached database (
11090 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
110a0 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20  t eMode,        
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
110c0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
110d0 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NT_* value */.  
110e0 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20  int *pnLog,     
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
11110 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65  WAL log in frame
11120 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b  s */.  int *pnCk
11130 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pt              
11140 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
11150 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66  otal number of f
11160 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74  rames checkpoint
11170 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  ed */.){.#ifdef 
11180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
11190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
111a0 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  OK;.#else.  int 
111b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
111c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
111d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
111e0 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45  int iDb = SQLITE
111f0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20  _MAX_ATTACHED;  
11200 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  /* sqlite3.aDb[]
11210 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20   index of db to 
11220 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23  checkpoint */..#
11230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11240 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
11250 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
11260 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
11270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
11280 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
11290 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  f..  /* Initiali
112a0 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
112b0 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
112c0 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
112d0 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
112e0 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
112f0 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
11300 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
11310 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
11320 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
11330 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61  ASSIVE==0 );.  a
11340 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
11350 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31  ECKPOINT_FULL==1
11360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
11370 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
11380 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20  RESTART==2 );.  
11390 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
113a0 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
113b0 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65  TE==3 );.  if( e
113c0 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43  Mode<SQLITE_CHEC
113d0 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c  KPOINT_PASSIVE |
113e0 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43  | eMode>SQLITE_C
113f0 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
11400 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TE ){.    /* EVI
11410 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39  DENCE-OF: R-0399
11420 36 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70 61  6-12088 The M pa
11430 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
11440 61 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69  a valid checkpoi
11450 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20  nt.    ** mode: 
11460 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
11470 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
11480 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
11490 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
114a0 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26  x);.  if( zDb &&
114b0 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69   zDb[0] ){.    i
114c0 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
114d0 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
114e0 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30  .  }.  if( iDb<0
114f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11500 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
11510 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
11520 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  sg(db, SQLITE_ER
11530 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  ROR, "unknown da
11540 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62  tabase: %s", zDb
11550 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11560 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
11570 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 72  nBusy = 0;.    r
11580 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b  c = sqlite3Check
11590 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65  point(db, iDb, e
115a0 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
115b0 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  kpt);.    sqlite
115c0 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
115d0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
115e0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
115f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
11600 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
11610 73 74 61 74 65 6d 65 6e 74 73 2c 20 63 6c 65 61  statements, clea
11620 72 20 74 68 65 20 69 6e 74 65 72 72 75 70 74 20  r the interrupt 
11630 66 6c 61 67 20 61 74 20 74 68 69 73 0a 20 20 2a  flag at this.  *
11640 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 69  * point.  */.  i
11650 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
11660 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ve==0 ){.    db-
11670 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
11680 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 71  d = 0;.  }..  sq
11690 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
116a0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
116b0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
116c0 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
116d0 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
116e0 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
116f0 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
11700 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
11710 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
11720 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
11730 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
11740 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
11750 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
11760 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
11770 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
11780 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
11790 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
117a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
117b0 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20  : R-41613-20553 
117c0 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
117d0 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20  checkpoint(D,X) 
117e0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
117f0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61  .  ** sqlite3_wa
11800 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
11810 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  D,X,SQLITE_CHECK
11820 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
11830 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  0). */.  return 
11840 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
11850 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62  kpoint_v2(db,zDb
11860 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  ,SQLITE_CHECKPOI
11870 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b  NT_PASSIVE,0,0);
11880 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11890 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
118a0 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69  * Run a checkpoi
118b0 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69  nt on database i
118c0 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  Db. This is a no
118d0 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20  -op if database 
118e0 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75  iDb is.** not cu
118f0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20  rrently open in 
11900 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  WAL mode..**.** 
11910 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
11920 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   is open on the 
11930 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63  database being c
11940 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69  heckpointed, thi
11950 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
11960 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f  eturns SQLITE_LO
11970 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b  CKED and a check
11980 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74  point is not att
11990 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61  empted. If .** a
119a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
119b0 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65  hile running the
119c0 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20   checkpoint, an 
119d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
119e0 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
119f0 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49  d (i.e. SQLITE_I
11a00 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65  OERR). Otherwise
11a10 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
11a20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20  ** The mutex on 
11a30 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
11a40 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  db should be hel
11a50 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
11a60 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73   The mutex.** as
11a70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
11a80 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65  e specific b-tre
11a90 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
11aa0 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79  nted is taken by
11ab0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
11ac0 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63  n while the chec
11ad0 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e  kpoint is runnin
11ae0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20  g..**.** If iDb 
11af0 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45  is passed SQLITE
11b00 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74  _MAX_ATTACHED, t
11b10 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64  hen all attached
11b20 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a   databases are.*
11b30 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20  * checkpointed. 
11b40 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
11b50 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
11b60 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
11b70 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74  ately -.** no at
11b80 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
11b90 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20   checkpoint any 
11ba0 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61  remaining databa
11bb0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ses..**.** Param
11bc0 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e  eter eMode is on
11bd0 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43  e of SQLITE_CHEC
11be0 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
11bf0 46 55 4c 4c 2c 20 52 45 53 54 41 52 54 0a 2a 2a  FULL, RESTART.**
11c00 20 6f 72 20 54 52 55 4e 43 41 54 45 2e 0a 2a 2f   or TRUNCATE..*/
11c10 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
11c20 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
11c30 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
11c40 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
11c50 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
11c60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11c70 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
11c80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
11c90 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
11cc0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
11cd0 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
11ce0 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
11cf0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11d00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
11d10 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
11d20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
11d30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
11d40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11d50 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
11d60 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
11d70 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
11d80 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
11d90 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
11da0 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
11db0 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
11dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
11dd0 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
11de0 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
11df0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
11e00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
11e10 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
11e20 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
11e30 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
11e40 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
11e50 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
11e60 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
11e70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11e80 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
11e90 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
11ea0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11eb0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
11ec0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
11ed0 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
11ee0 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
11ef0 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
11f00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11f10 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
11f20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11f30 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
11f40 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
11f50 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
11f60 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
11f70 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
11f80 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
11f90 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
11fa0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
11fb0 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
11fc0 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
11fd0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
11fe0 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
11ff0 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
12000 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
12010 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
12020 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
12030 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
12040 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
12050 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
12060 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
12070 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
12080 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
12090 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
120a0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
120b0 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
120c0 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
120d0 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
120e0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
120f0 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
12100 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
12110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
12120 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
12130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
12140 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
12150 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
12170 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
12180 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
121c0 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121e0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
121f0 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
12200 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
12230 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
12240 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
12250 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
12260 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
12270 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
12280 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
12290 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
122a0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
122c0 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
122d0 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
12310 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
12340 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
12350 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
12360 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
12370 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
12380 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
12390 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
123a0 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
123b0 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
123c0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
123d0 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
123e0 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
123f0 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
12400 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
12410 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
12420 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12430 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ER(db);.  return
12440 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   1;.#endif.#if S
12450 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
12460 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d  <1 || SQLITE_TEM
12470 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53  P_STORE>3.  UNUS
12480 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
12490 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
124a0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
124b0 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
124c0 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
124d0 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
124e0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
124f0 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
12500 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
12510 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
12520 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
12530 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
12540 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
12550 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
12560 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
12570 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  T);.  }.  if( !s
12580 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
12590 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
125a0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
125b0 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
125c0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20  _MISUSE_BKPT);. 
125d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
125e0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
125f0 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
12600 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12610 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
12620 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
12630 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c 73 65  M_BKPT);.  }else
12640 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
12650 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20  db->pErr==0 );. 
12660 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71     z = (char*)sq
12670 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
12680 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
12690 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
126a0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
126b0 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
126c0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
126d0 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
126e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
126f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12700 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
12710 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
12720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12730 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
12740 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f  turn UTF-16 enco
12750 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
12760 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
12770 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
12780 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
12790 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
127a0 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71  ite3_errmsg16(sq
127b0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74  lite3 *db){.  st
127c0 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f  atic const u16 o
127d0 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20  utOfMem[] = {.  
127e0 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
127f0 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20   ' ', 'o', 'f', 
12800 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27  ' ', 'm', 'e', '
12810 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79  m', 'o', 'r', 'y
12820 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ', 0.  };.  stat
12830 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73  ic const u16 mis
12840 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 62  use[] = {.    'b
12850 27 2c 20 27 61 27 2c 20 27 64 27 2c 20 27 20 27  ', 'a', 'd', ' '
12860 2c 20 27 70 27 2c 20 27 61 27 2c 20 27 72 27 2c  , 'p', 'a', 'r',
12870 20 27 61 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20   'a', 'm', 'e', 
12880 27 74 27 2c 20 27 65 27 2c 20 27 72 27 2c 20 27  't', 'e', 'r', '
12890 20 27 2c 0a 20 20 20 20 27 6f 27 2c 20 27 72 27   ',.    'o', 'r'
128a0 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 74 27 2c  , ' ', 'o', 't',
128b0 20 27 68 27 2c 20 27 65 27 2c 20 27 72 27 2c 20   'h', 'e', 'r', 
128c0 27 20 27 2c 20 27 41 27 2c 20 27 50 27 2c 20 27  ' ', 'A', 'P', '
128d0 49 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6d 27  I', ' ',.    'm'
128e0 2c 20 27 69 27 2c 20 27 73 27 2c 20 27 75 27 2c  , 'i', 's', 'u',
128f0 20 27 73 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d   's', 'e', 0.  }
12900 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ;..  const void 
12910 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
12920 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
12930 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
12940 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
12950 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
12960 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
12970 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69  eturn (void *)mi
12980 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  suse;.  }.  sqli
12990 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
129a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
129b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
129c0 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76  ed ){.    z = (v
129d0 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
129e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
129f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
12a00 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
12a10 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
12a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
12a30 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64  rorWithMsg(db, d
12a40 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69  b->errCode, sqli
12a50 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
12a60 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a  rCode));.      z
12a70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
12a80 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
12a90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
12aa0 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68  A malloc() may h
12ab0 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69  ave failed withi
12ac0 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  n the call to sq
12ad0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
12ae0 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  16().    ** abov
12af0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
12b00 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
12b10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12b20 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a  d flag needs to.
12b30 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65      ** be cleare
12b40 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
12b50 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65  ng. Do this dire
12b60 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
12b70 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69   via.    ** sqli
12b80 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f  te3ApiExit(), to
12b90 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74   avoid setting t
12ba0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
12bb0 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
12bc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
12bd0 69 74 65 33 4f 6f 6d 43 6c 65 61 72 28 64 62 29  ite3OomClear(db)
12be0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
12bf0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
12c00 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
12c10 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
12c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
12c30 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
12c40 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
12c50 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
12c60 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
12c70 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
12c80 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
12c90 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
12ca0 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
12cb0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
12cc0 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
12cd0 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
12ce0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
12cf0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
12d00 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
12d10 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
12d20 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
12d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
12d40 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
12d50 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
12d60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
12d70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12d80 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
12d90 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
12da0 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72  rrCode & db->err
12db0 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Mask;.}.int sqli
12dc0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
12dd0 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
12de0 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
12df0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12e00 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
12e10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12e20 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
12e30 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
12e40 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12e50 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
12e60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
12e70 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
12e80 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a   db->errCode;.}.
12e90 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 73 74  int sqlite3_syst
12ea0 65 6d 5f 65 72 72 6e 6f 28 73 71 6c 69 74 65 33  em_errno(sqlite3
12eb0 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
12ec0 64 62 20 3f 20 64 62 2d 3e 69 53 79 73 45 72 72  db ? db->iSysErr
12ed0 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a 2f 2a 0a  no : 0;.}  ../*.
12ee0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69  ** Return a stri
12ef0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
12f00 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
12f10 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
12f20 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
12f30 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73  .  For now, this
12f40 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68   simply calls th
12f50 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74  e internal sqlit
12f60 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75  e3ErrStr().** fu
12f70 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74  nction..*/.const
12f80 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65   char *sqlite3_e
12f90 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20  rrstr(int rc){. 
12fa0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
12fb0 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a  rrStr(rc);.}../*
12fc0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
12fd0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
12fe0 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65  ion for database
12ff0 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65   "db".  The name
13000 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64   is zName.** and
13010 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   the encoding is
13020 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   enc..*/.static 
13030 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  int createCollat
13040 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
13050 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
13060 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65   *zName, .  u8 e
13070 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  nc,.  void* pCtx
13080 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
13090 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
130a0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
130b0 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
130c0 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
130d0 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
130e0 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
130f0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
13100 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13110 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
13120 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
13130 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
13140 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
13150 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
13160 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
13170 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
13180 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
13190 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
131a0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
131b0 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
131c0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
131d0 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
131e0 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32  lly..  */.  enc2
131f0 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61   = enc;.  testca
13200 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
13210 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74  _UTF16 );.  test
13220 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
13230 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
13240 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d   );.  if( enc2==
13250 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20  SQLITE_UTF16 || 
13260 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
13270 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20  16_ALIGNED ){.  
13280 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f    enc2 = SQLITE_
13290 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
132a0 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49  .  if( enc2<SQLI
132b0 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e  TE_UTF8 || enc2>
132c0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
132d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
132e0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
132f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
13300 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   if this call is
13310 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70   removing or rep
13320 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69  lacing an existi
13330 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20  ng collation .  
13340 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20  ** sequence. If 
13350 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  so, and there ar
13360 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65  e active VMs, re
13370 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68  turn busy. If th
13380 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20  ere.  ** are no 
13390 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61  active VMs, inva
133a0 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63  lidate any pre-c
133b0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
133c0 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c  ts..  */.  pColl
133d0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
133e0 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
133f0 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  c2, zName, 0);. 
13400 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
13410 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
13420 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
13430 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
13440 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
13450 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
13460 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
13470 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
13480 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  dify collation s
13490 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61  equence due to a
134a0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
134b0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
134c0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
134d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
134e0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
134f0 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20  tements(db);..  
13500 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f    /* If collatio
13510 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
13520 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72   was created dir
13530 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20  ectly by a call 
13540 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
13550 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
13560 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65  on, and not gene
13570 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f  rated by synthCo
13580 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20  llSeq(),.    ** 
13590 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20  then any copies 
135a0 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c  made by synthCol
135b0 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62  lSeq() need to b
135c0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20  e invalidated.. 
135d0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c     ** Also, coll
135e0 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72  ation destructor
135f0 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28   - CollSeq.xDel(
13600 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  ) - function may
13610 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
13620 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  be called..    *
13630 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c  / .    if( (pCol
13640 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45  l->enc & ~SQLITE
13650 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d  _UTF16_ALIGNED)=
13660 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43  =enc2 ){.      C
13670 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20  ollSeq *aColl = 
13680 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
13690 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a  &db->aCollSeq, z
136a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  Name);.      int
136b0 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
136c0 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
136d0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
136e0 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20   = &aColl[j];.  
136f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63        if( p->enc
13700 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
13710 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
13720 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  >xDel ){.       
13730 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e       p->xDel(p->
13740 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pUser);.        
13750 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
13760 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  >xCmp = 0;.     
13770 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13780 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20   }.  }..  pColl 
13790 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
137a0 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
137b0 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20  2, zName, 1);.  
137c0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72  if( pColl==0 ) r
137d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
137e0 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 43 6f 6c 6c  EM_BKPT;.  pColl
137f0 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72  ->xCmp = xCompar
13800 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65  e;.  pColl->pUse
13810 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c  r = pCtx;.  pCol
13820 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a  l->xDel = xDel;.
13830 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28    pColl->enc = (
13840 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20  u8)(enc2 | (enc 
13850 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  & SQLITE_UTF16_A
13860 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69  LIGNED));.  sqli
13870 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
13880 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72  ITE_OK);.  retur
13890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
138a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61  ./*.** This arra
138b0 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75  y defines hard u
138c0 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c  pper bounds on l
138d0 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68  imit values.  Th
138e0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72  e.** initializer
138f0 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e   must be kept in
13900 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53   sync with the S
13910 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a  QLITE_LIMIT_*.**
13920 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c   #defines in sql
13930 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69  ite3.h..*/.stati
13940 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72  c const int aHar
13950 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53  dLimit[] = {.  S
13960 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13970 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ,.  SQLITE_MAX_S
13980 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  QL_LENGTH,.  SQL
13990 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a  ITE_MAX_COLUMN,.
139a0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50    SQLITE_MAX_EXP
139b0 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54  R_DEPTH,.  SQLIT
139c0 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
139d0 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f  ELECT,.  SQLITE_
139e0 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53  MAX_VDBE_OP,.  S
139f0 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
13a00 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45  ON_ARG,.  SQLITE
13a10 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20  _MAX_ATTACHED,. 
13a20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
13a30 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c  _PATTERN_LENGTH,
13a40 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  .  SQLITE_MAX_VA
13a50 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20  RIABLE_NUMBER,  
13a60 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38      /* IMP: R-38
13a70 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53  091-32352 */.  S
13a80 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
13a90 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54  R_DEPTH,.  SQLIT
13aa0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13ab0 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  EADS,.};../*.** 
13ac0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61  Make sure the ha
13ad0 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65  rd limits are se
13ae0 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20  t to reasonable 
13af0 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51  values.*/.#if SQ
13b00 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c  LITE_MAX_LENGTH<
13b10 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
13b20 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75  TE_MAX_LENGTH mu
13b30 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
13b40 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
13b50 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
13b60 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
13b70 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
13b80 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
13b90 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
13ba0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13bb0 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49  _SQL_LENGTH>SQLI
13bc0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20  TE_MAX_LENGTH.# 
13bd0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13be0 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
13bf0 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20   not be greater 
13c00 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
13c10 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69  LENGTH.#endif.#i
13c20 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  f SQLITE_MAX_COM
13c30 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23  POUND_SELECT<2.#
13c40 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13c50 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
13c60 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  T must be at lea
13c70 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 2.#endif.#if 
13c80 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
13c90 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51  OP<40.# error SQ
13ca0 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
13cb0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13cc0 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  t 40.#endif.#if 
13cd0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
13ce0 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c  ION_ARG<0 || SQL
13cf0 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
13d00 5f 41 52 47 3e 31 32 37 0a 23 20 65 72 72 6f 72  _ARG>127.# error
13d10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
13d20 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65  TION_ARG must be
13d30 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
13d40 32 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  27.#endif.#if SQ
13d50 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
13d60 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  D<0 || SQLITE_MA
13d70 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23  X_ATTACHED>125.#
13d80 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13d90 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20  X_ATTACHED must 
13da0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
13db0 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20   125.#endif.#if 
13dc0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
13dd0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
13de0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13df0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
13e00 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
13e10 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
13e20 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13e30 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20  _COLUMN>32767.# 
13e40 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13e50 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74  _COLUMN must not
13e60 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65   exceed 32767.#e
13e70 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13e80 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
13e90 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
13ea0 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
13eb0 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  EPTH must be at 
13ec0 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
13ed0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  if SQLITE_MAX_WO
13ee0 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c  RKER_THREADS<0 |
13ef0 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  | SQLITE_MAX_WOR
13f00 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23  KER_THREADS>50.#
13f10 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13f20 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
13f30 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
13f40 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66   0 and 50.#endif
13f50 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
13f60 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c  the value of a l
13f70 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68  imit.  Report th
13f80 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20  e old value..** 
13f90 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69  If an invalid li
13fa0 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75 70  mit index is sup
13fb0 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31  plied, report -1
13fc0 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61  ..** Make no cha
13fd0 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72  nges but still r
13fe0 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
13ff0 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  lue if the.** ne
14000 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  w limit is negat
14010 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ive..**.** A new
14020 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65   lower limit doe
14030 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69  s not shrink exi
14040 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73  sting constructs
14050 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70  ..** It merely p
14060 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73  revents new cons
14070 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63 65  tructs that exce
14080 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20  ed the limit.** 
14090 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f  from forming..*/
140a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d  .int sqlite3_lim
140b0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
140c0 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74  int limitId, int
140d0 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e   newLimit){.  in
140e0 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66  t oldLimit;..#if
140f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14100 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
14110 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
14120 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
14130 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
14140 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
14150 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
14160 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49  #endif..  /* EVI
14170 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38  DENCE-OF: R-3018
14180 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63 68  9-54097 For each
14190 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20   limit category 
141a0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d  SQLITE_LIMIT_NAM
141b0 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  E.  ** there is 
141c0 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  a hard upper bou
141d0 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c  nd set at compil
141e0 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70 72  e-time by a C pr
141f0 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20  eprocessor.  ** 
14200 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c  macro called SQL
14210 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54  ITE_MAX_NAME. (T
14220 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20  he "_LIMIT_" in 
14230 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e  the name is chan
14240 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41  ged to.  ** "_MA
14250 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73  X_".).  */.  ass
14260 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14270 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
14280 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  GTH]==SQLITE_MAX
14290 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
142a0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
142b0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
142c0 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
142d0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
142e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
142f0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14300 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51  IMIT_COLUMN]==SQ
14310 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
14320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
14330 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14340 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
14350 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  ==SQLITE_MAX_EXP
14360 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
14370 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14380 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
14390 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53  POUND_SELECT]==S
143a0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
143b0 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73  ND_SELECT);.  as
143c0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
143d0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44  [SQLITE_LIMIT_VD
143e0 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d  BE_OP]==SQLITE_M
143f0 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20  AX_VDBE_OP );.  
14400 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
14410 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14420 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53  FUNCTION_ARG]==S
14430 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
14440 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65  ON_ARG );.  asse
14450 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
14460 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
14470 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  CHED]==SQLITE_MA
14480 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20  X_ATTACHED );.  
14490 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
144a0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
144b0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
144c0 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20  GTH]==.         
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58        SQLITE_MAX
14500 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
14510 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  NGTH );.  assert
14520 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
14530 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
14540 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49  LE_NUMBER]==SQLI
14550 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
14560 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72  NUMBER);.  asser
14570 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
14580 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
14590 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  ER_DEPTH]==SQLIT
145a0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
145b0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
145c0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
145d0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
145e0 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45  THREADS]==SQLITE
145f0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
14600 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ADS );.  assert(
14610 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
14620 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28 53  RKER_THREADS==(S
14630 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29  QLITE_N_LIMIT-1)
14640 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69   );...  if( limi
14650 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64  tId<0 || limitId
14660 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  >=SQLITE_N_LIMIT
14670 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
14680 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69  1;.  }.  oldLimi
14690 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c  t = db->aLimit[l
146a0 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e  imitId];.  if( n
146b0 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20  ewLimit>=0 ){   
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146d0 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d  /* IMP: R-52476-
146e0 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28  28732 */.    if(
146f0 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c   newLimit>aHardL
14700 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b  imit[limitId] ){
14710 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20  .      newLimit 
14720 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  = aHardLimit[lim
14730 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20  itId];  /* IMP: 
14740 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f  R-51463-25634 */
14750 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
14760 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d  Limit[limitId] =
14770 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   newLimit;.  }. 
14780 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74   return oldLimit
14790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
147a0 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
147b0 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d  53341-35419 */.}
147c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
147d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
147e0 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49 73   parse both URIs
147f0 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   and non-URI fil
14800 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62 79  enames passed by
14810 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20   the.** user to 
14820 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71  API functions sq
14830 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20  lite3_open() or 
14840 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
14850 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62  ), and for datab
14860 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63  ase.** URIs spec
14870 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
14880 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e   ATTACH statemen
14890 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ts..**.** The fi
148a0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
148b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
148c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
148d0 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a   VFS to use (or.
148e0 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67  ** a NULL to sig
148f0 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c 74  nify the default
14900 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52 49   VFS) if the URI
14910 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
14920 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a  n a "vfs=xxx".**
14930 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
14940 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
14950 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74  ument contains t
14960 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55  he URI (or non-U
14970 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20  RI filename).** 
14980 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69  itself. When thi
14990 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
149a0 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73  lled the *pFlags
149b0 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
149c0 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20   contain.** the 
149d0 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f  default flags to
149e0 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
149f0 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20  se handle with. 
14a00 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  The value stored
14a10 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d   in.** *pFlags m
14a20 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62 65  ay be updated be
14a30 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
14a40 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61  f the URI filena
14a50 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20  me contains .** 
14a60 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22  "cache=xxx" or "
14a70 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79 20  mode=xxx" query 
14a80 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a  parameters..**.*
14a90 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
14aa0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14ab0 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
14ac0 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20 73  case *ppVfs is s
14ad0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
14ae0 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20 73  * the VFS that s
14af0 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  hould be used to
14b00 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
14b10 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65  se file. *pzFile
14b20 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f   is set to.** po
14b30 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
14b40 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
14b50 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
14b60 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74  to open. It is t
14b70 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
14b80 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
14b90 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
14ba0 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  y call sqlite3_f
14bb0 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65  ree() to release
14bc0 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e  .** this buffer.
14bd0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
14be0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
14bf0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
14c00 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14c10 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a   and *pzErrMsg.*
14c20 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  * may be set to 
14c30 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
14c40 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
14c50 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
14c60 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
14c70 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
14c80 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
14c90 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
14ca0 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
14cb0 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
14cc0 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
14cd0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e  e3_free()..*/.in
14ce0 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  t sqlite3ParseUr
14cf0 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i(.  const char 
14d00 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20  *zDefaultVfs,   
14d10 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
14d20 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78  se if no "vfs=xx
14d30 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20  x" query option 
14d40 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
14d50 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20 20  *zUri,          
14d60 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
14d70 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70 61  inated URI to pa
14d80 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rse */.  unsigne
14d90 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20  d int *pFlags,  
14da0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
14db0 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  UT: SQLITE_OPEN_
14dc0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73  XXX flags */.  s
14dd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56  qlite3_vfs **ppV
14de0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
14df0 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73  * OUT: VFS to us
14e00 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70  e */ .  char **p
14e10 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  zFile,          
14e20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
14e30 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65  Filename compone
14e40 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63  nt of URI */.  c
14e50 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14e70 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73  * OUT: Error mes
14e80 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c  sage (if rc!=SQL
14e90 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20  ITE_OK) */.){.  
14ea0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14eb0 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  OK;.  unsigned i
14ec0 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61  nt flags = *pFla
14ed0 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  gs;.  const char
14ee0 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c   *zVfs = zDefaul
14ef0 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46  tVfs;.  char *zF
14f00 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  ile;.  char c;. 
14f10 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69   int nUri = sqli
14f20 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69  te3Strlen30(zUri
14f30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  );..  assert( *p
14f40 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20  zErrMsg==0 );.. 
14f50 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20 53   if( ((flags & S
14f60 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
14f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14f80 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33 32 32 30  MP: R-48725-3220
14f90 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  6 */.           
14fa0 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
14fb0 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
14fc0 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36 38  ) /* IMP: R-5168
14fd0 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20 26 26  9-46548 */.   &&
14fe0 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63   nUri>=5 && memc
14ff0 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22  mp(zUri, "file:"
15000 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20  , 5)==0 /* IMP: 
15010 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20 2a 2f  R-57884-37496 */
15020 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
15030 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53  zOpt;.    int eS
15040 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
15050 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
15060 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61 72  r state when par
15070 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20  sing URI */.    
15080 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20  int iIn;        
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
150a0 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65 72   Input character
150b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
150c0 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20  t iOut = 0;     
150d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
150e0 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72 20  utput character 
150f0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75 36 34  index */.    u64
15100 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b   nByte = nUri+2;
15110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
15120 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
15130 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20  allocate */..   
15140 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
15150 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  e SQLITE_OPEN_UR
15160 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  I flag is set to
15170 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65   indicate to the
15180 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20   VFS xOpen .    
15190 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74  ** method that t
151a0 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74 72  here may be extr
151b0 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c  a parameters fol
151c0 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d  lowing the file-
151d0 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c  name.  */.    fl
151e0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
151f0 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72  EN_URI;..    for
15200 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69  (iIn=0; iIn<nUri
15210 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b  ; iIn++) nByte +
15220 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26  = (zUri[iIn]=='&
15230 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  ');.    zFile = 
15240 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
15250 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
15260 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
15270 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
15280 50 54 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20 35  PT;..    iIn = 5
15290 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
152a0 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f 52  ALLOW_URI_AUTHOR
152b0 49 54 59 0a 20 20 20 20 69 66 28 20 73 74 72 6e  ITY.    if( strn
152c0 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 2f  cmp(zUri+5, "///
152d0 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 3)==0 ){.    
152e0 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20    iIn = 7;.     
152f0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
15300 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61 75 73  g condition caus
15310 65 73 20 55 52 49 73 20 77 69 74 68 20 66 69 76  es URIs with fiv
15320 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72  e leading / char
15330 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  acters.      ** 
15340 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f 2f 68  like file://///h
15350 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65 20 63  ost/path to be c
15360 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 55 4e  onverted into UN
15370 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74 2f 70  Cs like //host/p
15380 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ath..      ** Th
15390 65 20 63 6f 72 72 65 63 74 20 55 52 49 20 66 6f  e correct URI fo
153a0 72 20 74 68 61 74 20 55 4e 43 20 68 61 73 20 6f  r that UNC has o
153b0 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75 72 20  nly two or four 
153c0 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63  leading / charac
153d0 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  ters.      ** fi
153e0 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68 20 6f  le://host/path o
153f0 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73 74 2f  r file:////host/
15400 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c 65 61  path.  But 5 lea
15410 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69 73 20  ding slashes is 
15420 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d  a .      ** comm
15430 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61 72 65  on error, we are
15440 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68 61 6e   told, so we han
15450 64 6c 65 20 69 74 20 61 73 20 61 20 73 70 65 63  dle it as a spec
15460 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  ial case. */.   
15470 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
15480 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20 33 29  Uri+7, "///", 3)
15490 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20 7d 0a  ==0 ){ iIn++; }.
154a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
154b0 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f  rncmp(zUri+5, "/
154c0 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20 31 32  /localhost/", 12
154d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49  )==0 ){.      iI
154e0 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a 23 65  n = 16;.    }.#e
154f0 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  lse.    /* Disca
15500 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e  rd the scheme an
15510 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d  d authority segm
15520 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e  ents of the URI.
15530 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69   */.    if( zUri
15540 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69  [5]=='/' && zUri
15550 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [6]=='/' ){.    
15560 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20    iIn = 7;.     
15570 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
15580 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
15590 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '/' ) iIn++;.   
155a0 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26 26     if( iIn!=7 &&
155b0 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d   (iIn!=16 || mem
155c0 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c  cmp("localhost",
155d0 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20 29   &zUri[7], 9)) )
155e0 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
155f0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
15600 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 75  rintf("invalid u
15610 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25 2e  ri authority: %.
15620 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  *s", .          
15630 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37    iIn-7, &zUri[7
15640 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
15650 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15660 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
15670 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
15680 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
15690 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
156a0 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e   filename and an
156b0 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  y query paramete
156c0 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c  rs into the zFil
156d0 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a  e buffer. .    *
156e0 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73 63  * Decode %HH esc
156f0 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20  ape codes along 
15700 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a  the way. .    **
15710 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74  .    ** Within t
15720 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62  his loop, variab
15730 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62 65  le eState may be
15740 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20   set to 0, 1 or 
15750 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20  2, depending.   
15760 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69   ** on the parsi
15770 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66  ng context. As f
15780 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20  ollows:.    **. 
15790 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69     **   0: Parsi
157a0 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20  ng file-name..  
157b0 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e    **   1: Parsin
157c0 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f  g name section o
157d0 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
157e0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
157f0 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73      **   2: Pars
15800 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f  ing value sectio
15810 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
15820 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
15830 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53  r..    */.    eS
15840 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68  tate = 0;.    wh
15850 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
15860 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
15870 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b  ' ){.      iIn++
15880 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
15890 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  %' .       && sq
158a0 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
158b0 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20  ri[iIn]) .      
158c0 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
158d0 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29  git(zUri[iIn+1])
158e0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
158f0 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28     int octet = (
15900 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
15910 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20  zUri[iIn++]) << 
15920 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65  4);.        octe
15930 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54  t += sqlite3HexT
15940 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
15950 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
15960 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20  rt( octet>=0 && 
15970 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20  octet<256 );.   
15980 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d       if( octet==
15990 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
159a0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 52 49 5f 30  ITE_ENABLE_URI_0
159b0 30 5f 45 52 52 4f 52 0a 20 20 20 20 20 20 20 20  0_ERROR.        
159c0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
159d0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22   is taken when "
159e0 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74  %00" appears wit
159f0 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20  hin the URI. In 
15a00 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
15a10 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65  * case we ignore
15a20 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65   all text in the
15a30 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
15a40 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a  e path, name or.
15a50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
15a60 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ue currently bei
15a70 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67  ng parsed. So ig
15a80 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  nore the current
15a90 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20   character.     
15aa0 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70       ** and skip
15ab0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22   to the next "?"
15ac0 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73  , "=" or "&", as
15ad0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f   appropriate. */
15ae0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
15af0 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
15b00 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a  )!=0 && c!='#' .
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
15b20 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63   (eState!=0 || c
15b30 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20  !='?').         
15b40 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
15b50 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26  =1 || (c!='=' &&
15b60 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20   c!='&')).      
15b70 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
15b80 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29  te!=2 || c!='&')
15b90 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
15ba0 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b            iIn++;
15bb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15bc0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
15bd0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
15be0 20 2f 2a 20 49 66 20 45 4e 41 42 4c 45 5f 55 52   /* If ENABLE_UR
15bf0 49 5f 30 30 5f 45 52 52 4f 52 20 69 73 20 64 65  I_00_ERROR is de
15c00 66 69 6e 65 64 2c 20 22 25 30 30 22 20 69 6e 20  fined, "%00" in 
15c10 61 20 55 52 49 20 69 73 20 61 6e 20 65 72 72 6f  a URI is an erro
15c20 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
15c30 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
15c40 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 65  te3_mprintf("une
15c50 78 70 65 63 74 65 64 20 25 25 30 30 20 69 6e 20  xpected %%00 in 
15c60 75 72 69 22 29 3b 0a 20 20 20 20 20 20 20 20 20  uri");.         
15c70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
15c80 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OR;.          go
15c90 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
15ca0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
15cb0 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f   }.        c = o
15cc0 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ctet;.      }els
15cd0 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20  e if( eState==1 
15ce0 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d  && (c=='&' || c=
15cf0 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='=') ){.       
15d00 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d   if( zFile[iOut-
15d10 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
15d20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f     /* An empty o
15d30 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f  ption name. Igno
15d40 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61  re this option a
15d50 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20  ltogether. */.  
15d60 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
15d70 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
15d80 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55  [iIn]!='#' && zU
15d90 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29  ri[iIn-1]!='&' )
15da0 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
15db0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
15dd0 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20  ( c=='&' ){.    
15de0 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
15df0 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
15e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15e10 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b       eState = 2;
15e20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15e30 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
15e40 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74  }else if( (eStat
15e50 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20  e==0 && c=='?') 
15e60 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26  || (eState==2 &&
15e70 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20   c=='&') ){.    
15e80 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
15e90 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20     eState = 1;. 
15ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69       }.      zFi
15eb0 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a  le[iOut++] = c;.
15ec0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53      }.    if( eS
15ed0 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b  tate==1 ) zFile[
15ee0 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
15ef0 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
15f00 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
15f10 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
15f20 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  0';..    /* Chec
15f30 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  k if there were 
15f40 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63  any options spec
15f50 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c  ified that shoul
15f60 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  d be interpreted
15f70 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f   .    ** here. O
15f80 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ptions that are 
15f90 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65  interpreted here
15fa0 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61   include "vfs" a
15fb0 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20  nd those that.  
15fc0 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20    ** correspond 
15fd0 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61  to flags that ma
15fe0 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74  y be passed to t
15ff0 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  he sqlite3_open_
16000 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68  v2().    ** meth
16010 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20  od. */.    zOpt 
16020 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33  = &zFile[sqlite3
16030 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
16040 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  1];.    while( z
16050 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Opt[0] ){.      
16060 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74  int nOpt = sqlit
16070 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29  e3Strlen30(zOpt)
16080 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
16090 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b  al = &zOpt[nOpt+
160a0 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56  1];.      int nV
160b0 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  al = sqlite3Strl
160c0 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20  en30(zVal);..   
160d0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26     if( nOpt==3 &
160e0 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20  & memcmp("vfs", 
160f0 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  zOpt, 3)==0 ){. 
16100 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56         zVfs = zV
16110 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  al;.      }else{
16120 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
16130 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20  OpenMode {.     
16140 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
16150 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  *z;.          in
16160 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  t mode;.        
16170 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  } *aMode = 0;.  
16180 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64        char *zMod
16190 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20  eType = 0;.     
161a0 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b     int mask = 0;
161b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  .        int lim
161c0 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  it = 0;..       
161d0 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20   if( nOpt==5 && 
161e0 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20  memcmp("cache", 
161f0 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20  zOpt, 5)==0 ){. 
16200 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
16210 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
16220 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b  aCacheMode[] = {
16230 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
16240 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45  shared",  SQLITE
16250 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
16260 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
16270 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51   { "private", SQ
16280 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
16290 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  ECACHE },.      
162a0 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
162b0 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
162c0 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
162d0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
162e0 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CACHE|SQLITE_OPE
162f0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a  N_PRIVATECACHE;.
16300 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
16310 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20  = aCacheMode;.  
16320 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
16330 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
16340 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63  zModeType = "cac
16350 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  he";.        }. 
16360 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
16370 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f  =4 && memcmp("mo
16380 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30  de", zOpt, 4)==0
16390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
163a0 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
163b0 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d  Mode aOpenMode[]
163c0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
163d0 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45   { "ro",  SQLITE
163e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d  _OPEN_READONLY }
163f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
16400 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  "rw",  SQLITE_OP
16410 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20  EN_READWRITE }, 
16420 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
16430 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  rwc", SQLITE_OPE
16440 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
16450 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16460 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
16470 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49  { "memory", SQLI
16480 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d  TE_OPEN_MEMORY }
16490 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
164a0 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
164b0 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
164c0 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
164d0 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c  N_READONLY | SQL
164e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
164f0 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  TE.             
16500 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
16510 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
16520 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b  ITE_OPEN_MEMORY;
16530 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
16540 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20   = aOpenMode;.  
16550 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
16560 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20  mask & flags;.  
16570 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
16580 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20  e = "access";.  
16590 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
165a0 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20   if( aMode ){.  
165b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
165c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
165d0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
165e0 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b   for(i=0; aMode[
165f0 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i].z; i++){.    
16600 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
16610 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d  ar *z = aMode[i]
16620 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .z;.            
16630 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65  if( nVal==sqlite
16640 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20  3Strlen30(z) && 
16650 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20  0==memcmp(zVal, 
16660 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20  z, nVal) ){.    
16670 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d            mode =
16680 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a   aMode[i].mode;.
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
166a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
166b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
166c0 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64           if( mod
166d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
166e0 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
166f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16700 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65  "no such %s mode
16710 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65  : %s", zModeType
16720 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
16730 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16740 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16750 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
16760 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
16770 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
16780 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54  ( (mode & ~SQLIT
16790 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c  E_OPEN_MEMORY)>l
167a0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
167b0 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
167c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
167d0 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c  "%s mode not all
167e0 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20  owed: %s",.     
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56     zModeType, zV
16820 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
16830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52   rc = SQLITE_PER
16840 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
16850 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
16860 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
16870 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d           flags =
16880 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29   (flags & ~mask)
16890 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20   | mode;.       
168a0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
168b0 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e    zOpt = &zVal[n
168c0 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20  Val+1];.    }.. 
168d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c   }else{.    zFil
168e0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
168f0 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20  oc64(nUri+2);.  
16900 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
16910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
16920 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  EM_BKPT;.    if(
16930 20 6e 55 72 69 20 29 7b 0a 20 20 20 20 20 20 6d   nUri ){.      m
16940 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72  emcpy(zFile, zUr
16950 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7d 0a  i, nUri);.    }.
16960 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20      zFile[nUri] 
16970 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
16980 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27  e[nUri+1] = '\0'
16990 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  ;.    flags &= ~
169a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
169b0 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d  .  }..  *ppVfs =
169c0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
169d0 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a  d(zVfs);.  if( *
169e0 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ppVfs==0 ){.    
169f0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
16a00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
16a10 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a  such vfs: %s", z
16a20 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  Vfs);.    rc = S
16a30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
16a40 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a  . parse_uri_out:
16a50 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
16a70 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b  te3_free(zFile);
16a80 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a  .    zFile = 0;.
16a90 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20    }.  *pFlags = 
16aa0 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65  flags;.  *pzFile
16ab0 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75   = zFile;.  retu
16ac0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
16ad0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
16ae0 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f  es the work of o
16af0 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73  pening a databas
16b00 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a  e on behalf of.*
16b10 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
16b20 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65   and sqlite3_ope
16b30 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62  n16(). The datab
16b40 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46  ase filename "zF
16b50 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73  ilename"  .** is
16b60 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a   UTF-8 encoded..
16b70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
16b80 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f  enDatabase(.  co
16b90 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
16ba0 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65  ame, /* Database
16bb0 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20   filename UTF-8 
16bc0 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c  encoded */.  sql
16bd0 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
16be0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
16bf0 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61  rned database ha
16c00 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ndle */.  unsign
16c10 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  ed int flags,   
16c20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20   /* Operational 
16c30 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
16c40 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
16c50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16c60 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29   VFS to use */.)
16c70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c90 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c      /* Store all
16ca0 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65  ocated handle he
16cb0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  re */.  int rc; 
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
16ce0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
16cf0 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20  isThreadsafe;   
16d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16d10 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61  rue for threadsa
16d20 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  fe connections *
16d30 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20  /.  char *zOpen 
16d40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
16d50 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
16d60 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  argument to pass
16d70 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20   to BtreeOpen() 
16d80 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
16d90 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sg = 0;         
16da0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
16db0 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74  ssage from sqlit
16dc0 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a  e3ParseUri() */.
16dd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
16de0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
16df0 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20    if( ppDb==0 ) 
16e00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
16e10 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
16e20 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23  f.  *ppDb = 0;.#
16e30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16e40 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63  IT_AUTOINIT.  rc
16e50 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69   = sqlite3_initi
16e60 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72  alize();.  if( r
16e70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
16e80 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c  endif..  if( sql
16e90 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16ea0 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29  .bCoreMutex==0 )
16eb0 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
16ec0 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
16ed0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
16ee0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
16ef0 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
16f00 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
16f10 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
16f20 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
16f30 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
16f40 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65  adsafe = 1;.  }e
16f50 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61  lse{.    isThrea
16f60 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47  dsafe = sqlite3G
16f70 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
16f80 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66  lMutex;.  }.  if
16f90 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
16fa0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
16fb0 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  HE ){.    flags 
16fc0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
16fd0 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
16fe0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
16ff0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
17000 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
17010 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
17020 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
17030 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
17040 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75  /* Remove harmfu
17050 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20  l bits from the 
17060 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
17070 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
17080 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
17090 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45  X and SQLITE_OPE
170a0 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67  N_FULLMUTEX flag
170b0 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c  s were.  ** deal
170c0 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72  t with in the pr
170d0 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63  evious code bloc
170e0 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73  k.  Besides thes
170f0 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a  e, the only.  **
17100 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61   valid input fla
17110 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f  gs for sqlite3_o
17120 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c  pen_v2() are SQL
17130 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
17140 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  Y,.  ** SQLITE_O
17150 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53  PEN_READWRITE, S
17160 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
17170 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  E, SQLITE_OPEN_S
17180 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a  HAREDCACHE,.  **
17190 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
171a0 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73  VATECACHE, and s
171b0 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74  ome reserved bit
171c0 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73  s.  Silently mas
171d0 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f  k.  ** off all o
171e0 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f  ther flags..  */
171f0 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
17200 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
17210 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
17220 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17230 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
17240 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
17250 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
17260 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20  IN_DB |.        
17270 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
17280 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20  EN_TEMP_DB | .  
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
172a0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
172b0 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  NT_DB | .       
172c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
172d0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
172e0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
172f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
17300 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  EMP_JOURNAL | . 
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
17320 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
17330 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
17340 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
17350 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
17360 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L |.            
17370 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e     SQLITE_OPEN_N
17380 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  OMUTEX |.       
17390 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
173a0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a  PEN_FULLMUTEX |.
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
173c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
173d0 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a              );..
173e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
173f0 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74  e sqlite data st
17400 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20  ructure */.  db 
17410 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
17420 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69  ero( sizeof(sqli
17430 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62  te3) );.  if( db
17440 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64  ==0 ) goto opend
17450 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54  b_out;.  if( isT
17460 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20  hreadsafe ){.   
17470 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c   db->mutex = sql
17480 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
17490 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
174a0 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  RSIVE);.    if( 
174b0 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  db->mutex==0 ){.
174c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
174d0 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62  ee(db);.      db
174e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
174f0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20   opendb_out;.   
17500 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
17510 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
17520 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
17530 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20  rrMask = 0xff;. 
17540 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20   db->nDb = 2;.  
17550 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
17560 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
17570 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
17580 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73  DbStatic;..  ass
17590 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
175a0 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
175b0 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
175c0 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
175d0 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
175e0 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
175f0 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69  t));.  db->aLimi
17600 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
17610 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d  ORKER_THREADS] =
17620 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17630 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a  WORKER_THREADS;.
17640 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
17650 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
17660 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
17670 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c  db->szMmap = sql
17680 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17690 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e  .szMmap;.  db->n
176a0 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
176b0 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65  .  db->nMaxSorte
176c0 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46  rMmap = 0x7FFFFF
176d0 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  FF;.  db->flags 
176e0 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
176f0 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
17700 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c  _EnableTrigger |
17710 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
17720 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ll.#if !defined(
17730 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
17740 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20  UTOMATIC_INDEX) 
17750 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  || SQLITE_DEFAUL
17760 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
17770 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X.              
17780 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f     | SQLITE_Auto
17790 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66  Index.#endif.#if
177a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
177b0 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20  CKPTFULLFSYNC.  
177c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
177d0 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c   SQLITE_CkptFull
177e0 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66  FSync.#endif.#if
177f0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17800 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20  FILE_FORMAT<4.  
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17820 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
17830 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66  leFmt.#endif.#if
17840 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17850 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
17860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17870 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45    | SQLITE_LoadE
17880 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a  xtension.#endif.
17890 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
178a0 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49  LT_RECURSIVE_TRI
178b0 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20  GGERS.          
178c0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
178d0 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64  RecTriggers.#end
178e0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
178f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
17900 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53  REIGN_KEYS) && S
17910 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
17920 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20  REIGN_KEYS.     
17930 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17940 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
17950 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
17960 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52  ned(SQLITE_REVER
17970 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c  SE_UNORDERED_SEL
17980 45 43 54 53 29 0a 20 20 20 20 20 20 20 20 20 20  ECTS).          
17990 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
179a0 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e  ReverseOrder.#en
179b0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
179c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
179d0 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
179e0 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K).             
179f0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c      | SQLITE_Cel
17a00 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 23  lSizeCk.#endif.#
17a10 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
17a20 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  E_ENABLE_FTS3_TO
17a30 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20 20 20 20  KENIZER).       
17a40 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17a50 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
17a60 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
17a70 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
17a80 45 5f 51 50 53 47 29 0a 20 20 20 20 20 20 20 20  E_QPSG).        
17a90 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17aa0 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a 23 65 6e  E_EnableQPSG.#en
17ab0 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
17ac0 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
17ad0 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
17ae0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17af0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
17b00 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
17b10 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
17b20 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
17b30 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
17b40 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
17b50 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77  BINARY. BINARY w
17b60 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54  orks for both UT
17b70 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46  F-8.  ** and UTF
17b80 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65  -16, so add a ve
17b90 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  rsion for each t
17ba0 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65  o avoid any unne
17bb0 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e  cessary.  ** con
17bc0 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  versions. The on
17bd0 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61  ly error that ca
17be0 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20  n occur here is 
17bf0 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
17c00 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56  re..  **.  ** EV
17c10 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37  IDENCE-OF: R-527
17c20 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20  86-44878 SQLite 
17c30 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75  defines three bu
17c40 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
17c50 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  .  ** functions:
17c60 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
17c70 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
17c80 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
17c90 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
17ca0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
17cb0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
17cc0 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
17cd0 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
17ce0 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
17cf0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
17d00 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
17d10 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
17d20 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  Y, SQLITE_UTF16L
17d30 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
17d40 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
17d50 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
17d60 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
17d70 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
17d80 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
17d90 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
17da0 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
17db0 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
17dc0 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
17dd0 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
17de0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17df0 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
17e00 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45  _out;.  }.  /* E
17e10 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
17e20 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65  308-17224 The de
17e30 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
17e40 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  function for all
17e50 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73  .  ** strings is
17e60 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20   BINARY. .  */. 
17e70 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
17e80 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
17e90 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
17ea0 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42  TF8, sqlite3StrB
17eb0 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73  INARY, 0);.  ass
17ec0 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
17ed0 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50  ll!=0 );..  /* P
17ee0 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
17ef0 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 0a 20  e/URI argument. 
17f00 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20 61 6c   **.  ** Only al
17f10 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d  low sensible com
17f20 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74  binations of bit
17f30 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61  s in the flags a
17f40 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20  rgument.  .  ** 
17f50 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
17f60 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20  f any non-sense 
17f70 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75  combination is u
17f80 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  sed.  If we.  **
17f90 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c   do not block il
17fa0 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f  legal combinatio
17fb0 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c  ns here, it coul
17fc0 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61  d trigger.  ** a
17fd0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
17fe0 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79  ts in deeper lay
17ff0 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63  ers.  Sensible c
18000 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a  ombinations.  **
18010 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   are:.  **.  ** 
18020 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   1:  SQLITE_OPEN
18030 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20  _READONLY.  **  
18040 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  2:  SQLITE_OPEN_
18050 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20  READWRITE.  **  
18060 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  6:  SQLITE_OPEN_
18070 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
18080 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20  TE_OPEN_CREATE. 
18090 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
180a0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 61  ags = flags;.  a
180b0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
180c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20  EN_READONLY  == 
180d0 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0x01 );.  assert
180e0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
180f0 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20  ADWRITE == 0x02 
18100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
18110 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
18120 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20     == 0x04 );.  
18130 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
18140 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29  lags&7))==0x02 )
18150 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f  ; /* READONLY */
18160 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
18170 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
18180 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  4 ); /* READWRIT
18190 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  E */.  testcase(
181a0 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
181b0 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44  =0x40 ); /* READ
181c0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a  WRITE | CREATE *
181d0 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c  /.  if( ((1<<(fl
181e0 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d  ags&7)) & 0x46)=
181f0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
18200 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
18210 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35  T;  /* IMP: R-65
18220 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d  497-44594 */.  }
18230 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
18240 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a  qlite3ParseUri(z
18250 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
18260 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66  &flags, &db->pVf
18270 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72  s, &zOpen, &zErr
18280 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Msg);.  }.  if( 
18290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
182a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
182b0 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69  ITE_NOMEM ) sqli
182c0 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
182d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
182e0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
182f0 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
18300 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
18310 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18320 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
18330 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
18340 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
18350 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
18360 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
18370 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18380 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
18390 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
183a0 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183c0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
183d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
183e0 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
183f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
18400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
18410 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
18420 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18430 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
18440 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
18450 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67  r(db, rc);.    g
18460 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
18470 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
18480 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b  eeEnter(db->aDb[
18490 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
184a0 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
184b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
184c0 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
184d0 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  pBt);.  if( !db-
184e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
184f0 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41  ENC(db) = SCHEMA
18500 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69  _ENC(db);.  sqli
18510 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 64 62  te3BtreeLeave(db
18520 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
18530 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
18540 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
18550 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a  emaGet(db, 0);..
18560 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
18570 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
18580 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
18590 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72  ase is FULL; for
185a0 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64   the temp.  ** d
185b0 61 74 61 62 61 73 65 20 69 74 20 69 73 20 4f 46  atabase it is OF
185c0 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  F. This matches 
185d0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
185e0 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
185f0 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44  .  db->aDb[0].zD
18600 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  bSName = "main";
18610 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61  .  db->aDb[0].sa
18620 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c  fety_level = SQL
18630 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
18640 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64 62 2d  HRONOUS+1;.  db-
18650 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
18660 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
18670 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
18680 65 76 65 6c 20 3d 20 50 41 47 45 52 5f 53 59 4e  evel = PAGER_SYN
18690 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20  CHRONOUS_OFF;.. 
186a0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
186b0 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
186c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
186d0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
186e0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
186f0 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
18700 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66  r all built-in f
18710 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f  unctions, but do
18720 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
18730 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61  read the.  ** da
18740 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65  tabase schema ye
18750 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79  t. This is delay
18760 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ed until the fir
18770 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  st time the data
18780 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63  base.  ** is acc
18790 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  essed..  */.  sq
187a0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
187b0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
187c0 69 74 65 33 52 65 67 69 73 74 65 72 50 65 72 43  ite3RegisterPerC
187d0 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69 6e  onnectionBuiltin
187e0 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20  Functions(db);. 
187f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
18800 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23 69 66 64  rcode(db);..#ifd
18810 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18820 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65 67 69 73  _FTS5.  /* Regis
18830 74 65 72 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e  ter any built-in
18840 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 62 65 66   FTS5 module bef
18850 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  ore loading the 
18860 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a 2a 20 65  automatic.  ** e
18870 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68 69 73 20  xtensions. This 
18880 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61 74 69 63  allows automatic
18890 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f 20 72   extensions to r
188a0 65 67 69 73 74 65 72 20 46 54 53 35 20 0a 20 20  egister FTS5 .  
188b0 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73 20 61 6e  ** tokenizers an
188c0 64 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  d auxiliary func
188d0 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69 66 28  tions.  */.  if(
188e0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
188f0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
18900 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
18910 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28  sqlite3Fts5Init(
18920 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
18930 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
18940 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
18950 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
18960 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
18970 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
18980 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
18990 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
189a0 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
189b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
189c0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
189d0 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  AutoLoadExtensio
189e0 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ns(db);.    rc =
189f0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
18a00 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
18a10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18a20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
18a30 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
18a40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18a50 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28  NABLE_FTS1.  if(
18a60 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
18a70 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  ed ){.    extern
18a80 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31   int sqlite3Fts1
18a90 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
18aa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18ab0 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts1Init(db);.  
18ac0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
18ad0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
18ae0 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS2.  if( !db->m
18af0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
18b00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18b10 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
18b20 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73  qlite3Fts2Init(s
18b30 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
18b40 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e   = sqlite3Fts2In
18b50 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
18b60 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18b70 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a  E_ENABLE_FTS3 /*
18b80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
18b90 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45  efined by SQLITE
18ba0 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a  _ENABLE_FTS4 */.
18bb0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
18bc0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
18bd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18be0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
18bf0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
18c00 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
18c10 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20  ITE_ENABLE_ICU. 
18c20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18c30 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18c50 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e  c = sqlite3IcuIn
18c60 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
18c70 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18c80 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20  E_ENABLE_RTREE. 
18c90 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18ca0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18cb0 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
18cc0 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49   = sqlite3RtreeI
18cd0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
18ce0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
18cf0 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45  TE_ENABLE_DBPAGE
18d00 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d  _VTAB.  if( !db-
18d10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
18d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
18d30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18d40 33 44 62 70 61 67 65 52 65 67 69 73 74 65 72 28  3DbpageRegister(
18d50 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
18d60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18d70 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41  NABLE_DBSTAT_VTA
18d80 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  B.  if( !db->mal
18d90 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18da0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
18db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73   rc = sqlite3Dbs
18dc0 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b  tatRegister(db);
18dd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18de0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18df0 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64  E_JSON1.  if( !d
18e00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18e10 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18e20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18e30 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29  te3Json1Init(db)
18e40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
18e50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18e60 4c 45 5f 53 54 4d 54 56 54 41 42 0a 20 20 69 66  LE_STMTVTAB.  if
18e70 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18e80 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
18e90 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
18ea0 73 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49  sqlite3StmtVtabI
18eb0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
18ec0 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49  dif..  /* -DSQLI
18ed0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18ee0 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20  NG_MODE=1 makes 
18ef0 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65  EXCLUSIVE the de
18f00 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
18f10 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49  ** mode.  -DSQLI
18f20 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18f30 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e  NG_MODE=0 make N
18f40 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
18f50 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
18f60 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68  ode.  Doing noth
18f70 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20  ing at all also 
18f80 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65  makes NORMAL the
18f90 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23   default..  */.#
18fa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
18fb0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
18fc0 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b  E.  db->dfltLock
18fd0 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
18fe0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
18ff0 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  DE;.  sqlite3Pag
19000 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71  erLockingMode(sq
19010 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
19020 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c  db->aDb[0].pBt),
19030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19040 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
19050 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
19060 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a  G_MODE);.#endif.
19070 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69  .  if( rc ) sqli
19080 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
19090 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74  ;..  /* Enable t
190a0 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c  he lookaside-mal
190b0 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f  loc subsystem */
190c0 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  .  setupLookasid
190d0 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33  e(db, 0, sqlite3
190e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c  GlobalConfig.szL
190f0 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20  ookaside,.      
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
19120 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65  onfig.nLookaside
19130 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  );..  sqlite3_wa
19140 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
19150 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  (db, SQLITE_DEFA
19160 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43  ULT_WAL_AUTOCHEC
19170 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62  KPOINT);..opendb
19180 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29  _out:.  if( db )
19190 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
191a0 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73  ->mutex!=0 || is
191b0 54 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20  Threadsafe==0.  
191c0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
191d0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
191e0 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
191f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
19200 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
19210 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
19220 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
19230 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
19240 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  b!=0 || rc==SQLI
19250 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66  TE_NOMEM );.  if
19260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
19270 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
19280 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
19290 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
192a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
192b0 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
192c0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
192d0 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a  IC_SICK;.  }.  *
192e0 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65  ppDb = db;.#ifde
192f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19300 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
19310 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19320 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
19330 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20  /* Opening a db 
19340 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70  handle. Fourth p
19350 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
19360 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69  ed 0. */.    voi
19370 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65  d *pArg = sqlite
19380 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
19390 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71  qllogArg;.    sq
193a0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
193b0 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20  g.xSqllog(pArg, 
193c0 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  db, zFilename, 0
193d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
193e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
193f0 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69 66  _HAS_CODEC).  if
19400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19410 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
19420 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69 66 28  r *zKey;.    if(
19430 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   (zKey = sqlite3
19440 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
19450 4f 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29 29  Open, "hexkey"))
19460 21 3d 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20 29  !=0 && zKey[0] )
19470 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65  {.      u8 iByte
19480 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
19490 20 20 20 20 20 63 68 61 72 20 7a 44 65 63 6f 64       char zDecod
194a0 65 64 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f  ed[40];.      fo
194b0 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20  r(i=0, iByte=0; 
194c0 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64 65  i<sizeof(zDecode
194d0 64 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49  d)*2 && sqlite3I
194e0 73 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d 29  sxdigit(zKey[i])
194f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
19500 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c  iByte = (iByte<<
19510 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54  4) + sqlite3HexT
19520 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20  oInt(zKey[i]);. 
19530 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29         if( (i&1)
19540 21 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b 69  !=0 ) zDecoded[i
19550 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20  /2] = iByte;.   
19560 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
19570 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c  e3_key_v2(db, 0,
19580 20 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32 29 3b   zDecoded, i/2);
19590 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
195a0 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75  zKey = sqlite3_u
195b0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f 70  ri_parameter(zOp
195c0 65 6e 2c 20 22 6b 65 79 22 29 29 21 3d 30 20 29  en, "key"))!=0 )
195d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
195e0 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a 4b  key_v2(db, 0, zK
195f0 65 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ey, sqlite3Strle
19600 6e 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20 20  n30(zKey));.    
19610 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  }.  }.#endif.  s
19620 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65  qlite3_free(zOpe
19630 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  n);.  return rc 
19640 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  & 0xff;.}../*.**
19650 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
19660 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
19670 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
19680 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
19690 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
196a0 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
196b0 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
196c0 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
196d0 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
196f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
19700 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
19710 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
19720 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
19730 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
19740 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
19750 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
19760 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
19770 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
19780 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
19790 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
197a0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
197b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
197c0 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
197d0 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
197e0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
197f0 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
19800 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
19810 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
19820 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
19830 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
19840 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
19850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19860 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
19870 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
19880 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
19890 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
198a0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
198b0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
198c0 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
198d0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
198e0 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
198f0 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
19900 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
19910 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
19920 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
19930 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  al;.  int rc;..#
19940 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19950 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
19960 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
19970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
19980 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
19990 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
199a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
199b0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
199c0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
199d0 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
199e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
199f0 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  dif.  if( zFilen
19a00 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61  ame==0 ) zFilena
19a10 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b  me = "\000\000";
19a20 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
19a30 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
19a40 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
19a50 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69  tr(pVal, -1, zFi
19a60 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  lename, SQLITE_U
19a70 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
19a80 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46  TE_STATIC);.  zF
19a90 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74  ilename8 = sqlit
19aa0 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
19ab0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
19ac0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38    if( zFilename8
19ad0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
19ae0 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
19af0 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20  ame8, ppDb,.    
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
19b20 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
19b30 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
19b40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
19b50 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  pDb || rc==SQLIT
19b60 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69  E_NOMEM );.    i
19b70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19b80 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72   && !DbHasProper
19b90 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f  ty(*ppDb, 0, DB_
19ba0 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b  SchemaLoaded) ){
19bb0 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e  .      SCHEMA_EN
19bc0 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a  C(*ppDb) = ENC(*
19bd0 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
19be0 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
19bf0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
19c00 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19c10 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
19c20 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
19c30 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  al);..  return r
19c40 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64  c & 0xff;.}.#end
19c50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
19c60 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
19c70 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
19c80 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19c90 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
19ca0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
19cb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
19cc0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
19cd0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
19ce0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
19cf0 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
19d00 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
19d10 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
19d20 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
19d30 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
19d40 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72  st void*).){.  r
19d50 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
19d60 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
19d70 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63  2(db, zName, enc
19d80 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
19d90 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
19da0 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
19db0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19dc0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
19dd0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
19de0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
19df0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
19e00 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
19e10 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
19e20 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
19e30 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
19e40 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
19e50 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
19e60 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
19e70 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
19e80 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
19e90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
19ea0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19eb0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
19ec0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
19ed0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
19ee0 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
19ef0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
19f00 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
19f10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
19f20 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
19f30 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
19f40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19f50 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
19f60 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
19f70 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
19f80 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
19f90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
19fa0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
19fb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
19fc0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
19fd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19fe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19ff0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
1a000 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1a010 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a020 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1a030 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1a040 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1a050 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
1a060 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
1a070 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
1a080 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
1a090 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1a0a0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1a0b0 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1a0c0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1a0d0 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
1a0e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a0f0 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
1a100 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
1a110 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1a120 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1a130 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1a140 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
1a150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1a160 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1a170 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1a180 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1a190 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
1a1a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a1b0 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
1a1c0 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
1a1d0 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
1a1e0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
1a1f0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
1a200 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
1a210 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
1a220 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c  zName8, (u8)enc,
1a230 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
1a240 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1a250 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
1a260 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
1a270 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
1a280 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1a290 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1a2a0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1a2b0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1a2c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1a2d0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
1a2e0 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
1a2f0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
1a300 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
1a310 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
1a320 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
1a330 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
1a340 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
1a350 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a360 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
1a370 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
1a380 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
1a390 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
1a3a0 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
1a3b0 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
1a3c0 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
1a3d0 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
1a3e0 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
1a3f0 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
1a400 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1a410 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1a420 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1a430 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1a440 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1a450 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1a460 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1a470 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1a480 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
1a490 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
1a4a0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
1a4b0 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
1a4c0 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
1a4d0 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
1a4e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1a4f0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1a500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a510 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1a520 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
1a530 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
1a540 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1a550 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
1a560 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
1a570 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
1a580 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
1a590 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
1a5a0 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
1a5b0 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
1a5c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1a5d0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
1a5e0 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
1a5f0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
1a600 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
1a610 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
1a620 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
1a630 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
1a640 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23  onst void*).){.#
1a650 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a660 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1a670 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1a680 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1a690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1a6a0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1a6b0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1a6c0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1a6d0 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
1a6e0 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
1a6f0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
1a700 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
1a710 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
1a720 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
1a730 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
1a740 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1a750 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1a760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1a770 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a780 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
1a790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a7a0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1a7b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1a7c0 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
1a7d0 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
1a7e0 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
1a7f0 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
1a800 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1a810 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
1a820 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
1a830 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
1a840 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
1a850 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
1a860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a870 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
1a880 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
1a890 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1a8a0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1a8b0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
1a8c0 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
1a8d0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1a8e0 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
1a8f0 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
1a900 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
1a910 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
1a920 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
1a930 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
1a940 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
1a950 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
1a960 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
1a970 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a  or ROLLBACK..*/.
1a980 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
1a990 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
1a9a0 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
1a9b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1a9c0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1a9d0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1a9e0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1a9f0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1aa00 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1aa10 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
1aa20 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  f.  return db->a
1aa30 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a  utoCommit;.}../*
1aa40 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1aa50 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73  g routines are s
1aa60 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63  ubstitutes for c
1aa70 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f  onstants SQLITE_
1aa80 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49  CORRUPT,.** SQLI
1aa90 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54  TE_MISUSE, SQLIT
1aaa0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49  E_CANTOPEN, SQLI
1aab0 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73  TE_NOMEM and pos
1aac0 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f  sibly other erro
1aad0 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20  r.** constants. 
1aae0 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20   They serve two 
1aaf0 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  purposes:.**.** 
1ab00 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61    1.  Serve as a
1ab10 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
1ab20 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
1ab30 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67  point in a debug
1ab40 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ger.**       to 
1ab50 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73  detect when vers
1ab60 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ion error condit
1ab70 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ions occurs..**.
1ab80 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20  **   2.  Invoke 
1ab90 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
1aba0 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75   provide the sou
1abb0 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f  rce code locatio
1abc0 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20  n where.**      
1abd0 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72   a low-level err
1abe0 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65  or is first dete
1abf0 63 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cted..*/.static 
1ac00 69 6e 74 20 72 65 70 6f 72 74 45 72 72 6f 72 28  int reportError(
1ac10 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69  int iErr, int li
1ac20 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72  neno, const char
1ac30 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69   *zType){.  sqli
1ac40 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25  te3_log(iErr, "%
1ac50 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  s at line %d of 
1ac60 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
1ac70 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c          zType, l
1ac80 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
1ac90 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
1aca0 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a   return iErr;.}.
1acb0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
1acc0 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  ptError(int line
1acd0 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1ace0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1acf0 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1ad00 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45    return reportE
1ad10 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52 52  rror(SQLITE_CORR
1ad20 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 22 64 61  UPT, lineno, "da
1ad30 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1ad40 6e 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  n");.}.int sqlit
1ad50 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e  e3MisuseError(in
1ad60 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1ad70 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1ad80 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1ad90 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
1ada0 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1adb0 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f  E_MISUSE, lineno
1adc0 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69  , "misuse");.}.i
1add0 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70  nt sqlite3Cantop
1ade0 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  enError(int line
1adf0 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1ae00 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1ae10 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1ae20 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45    return reportE
1ae30 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1ae40 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f 2c 20 22 63  OPEN, lineno, "c
1ae50 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 22  annot open file"
1ae60 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
1ae70 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
1ae80 69 74 65 33 43 6f 72 72 75 70 74 50 67 6e 6f 45  ite3CorruptPgnoE
1ae90 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 2c  rror(int lineno,
1aea0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 63   Pgno pgno){.  c
1aeb0 68 61 72 20 7a 4d 73 67 5b 31 30 30 5d 3b 0a 20  har zMsg[100];. 
1aec0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1aed0 66 28 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20  f(sizeof(zMsg), 
1aee0 7a 4d 73 67 2c 20 22 64 61 74 61 62 61 73 65 20  zMsg, "database 
1aef0 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65 20  corruption page 
1af00 25 64 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 74 65  %d", pgno);.  te
1af10 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1af20 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1af30 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1af40 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1af50 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65  TE_CORRUPT, line
1af60 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74  no, zMsg);.}.int
1af70 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72   sqlite3NomemErr
1af80 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1af90 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1afa0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1afb0 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1afc0 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28  urn reportError(
1afd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 6c 69  SQLITE_NOMEM, li
1afe0 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a 7d 0a  neno, "OOM");.}.
1aff0 69 6e 74 20 73 71 6c 69 74 65 33 49 6f 65 72 72  int sqlite3Ioerr
1b000 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c  nomemError(int l
1b010 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1b020 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1b030 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1b040 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f  );.  return repo
1b050 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  rtError(SQLITE_I
1b060 4f 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65  OERR_NOMEM, line
1b070 6e 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72  no, "I/O OOM err
1b080 6f 72 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  or");.}.#endif..
1b090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b0a0 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
1b0b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
1b0c0 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
1b0d0 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
1b0e0 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
1b0f0 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
1b100 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
1b110 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
1b120 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
1b130 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
1b140 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
1b150 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
1b160 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
1b170 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
1b180 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
1b190 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
1b1a0 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
1b1b0 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
1b1c0 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
1b1d0 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
1b1e0 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
1b1f0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1b200 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
1b210 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
1b220 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
1b230 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
1b240 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
1b250 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
1b260 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62  .int sqlite3_tab
1b270 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
1b280 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ta(.  sqlite3 *d
1b290 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1b2a0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1b2b0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
1b2c0 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
1b2d0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1b2e0 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c  ase name or NULL
1b2f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b300 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *zTableName,   
1b310 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
1b320 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b330 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20  *zColumnName,   
1b340 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
1b350 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
1b360 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20  **pzDataType,   
1b370 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c   /* OUTPUT: Decl
1b380 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a  ared data type *
1b390 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
1b3a0 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20  *pzCollSeq,     
1b3b0 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61  /* OUTPUT: Colla
1b3c0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
1b3d0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f  me */.  int *pNo
1b3e0 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  tNull,          
1b3f0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1b400 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20  rue if NOT NULL 
1b410 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74  constraint exist
1b420 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69  s */.  int *pPri
1b430 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20  maryKey,        
1b440 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1b450 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72  ue if column par
1b460 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74  t of PK */.  int
1b470 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20   *pAutoinc      
1b480 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
1b490 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
1b4a0 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65  mn is auto-incre
1b4b0 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
1b4c0 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1b4d0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c  rMsg = 0;.  Tabl
1b4e0 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43  e *pTab = 0;.  C
1b4f0 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
1b500 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b  .  int iCol = 0;
1b510 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1b520 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
1b530 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1b540 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
1b550 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
1b560 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
1b570 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
1b580 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53   = 0;...#ifdef S
1b590 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1b5a0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1b5b0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1b5c0 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65  Ok(db) || zTable
1b5d0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Name==0 ){.    r
1b5e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1b5f0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
1b600 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  ndif..  /* Ensur
1b610 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1b620 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c  chema has been l
1b630 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  oaded */.  sqlit
1b640 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1b650 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c  b->mutex);.  sql
1b660 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
1b670 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  l(db);.  rc = sq
1b680 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a  lite3Init(db, &z
1b690 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53  ErrMsg);.  if( S
1b6a0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
1b6b0 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1b6c0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  ut;.  }..  /* Lo
1b6d0 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
1b6e0 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20  n question */.  
1b6f0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
1b700 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62  ndTable(db, zTab
1b710 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29  leName, zDbName)
1b720 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c  ;.  if( !pTab ||
1b730 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
1b740 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a  {.    pTab = 0;.
1b750 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1b760 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ut;.  }..  /* Fi
1b770 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f  nd the column fo
1b780 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20  r which info is 
1b790 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69  requested */.  i
1b7a0 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d  f( zColumnName==
1b7b0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72  0 ){.    /* Quer
1b7c0 79 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20  y for existance 
1b7d0 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f  of table only */
1b7e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
1b7f0 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
1b800 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
1b810 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d  +){.      pCol =
1b820 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
1b830 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  l];.      if( 0=
1b840 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1b850 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
1b860 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
1b870 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1b890 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43  ( iCol==pTab->nC
1b8a0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ol ){.      if( 
1b8b0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1b8c0 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  & sqlite3IsRowid
1b8d0 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b  (zColumnName) ){
1b8e0 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  .        iCol = 
1b8f0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
1b900 20 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c       pCol = iCol
1b910 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f  >=0 ? &pTab->aCo
1b920 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20  l[iCol] : 0;.   
1b930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b940 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
1b950 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
1b960 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1b970 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
1b980 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
1b990 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20  stores the meta 
1b9a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
1b9b0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1b9c0 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61  d.  ** to the ca
1b9d0 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61  ller in local va
1b9e0 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70  riables zDataTyp
1b9f0 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74  e, zCollSeq, not
1ba00 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79  null, primarykey
1ba10 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e  .  ** and autoin
1ba20 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  c. At this point
1ba30 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1ba40 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20  ossibilities:.  
1ba50 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20  ** .  **     1. 
1ba60 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  The specified co
1ba70 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f  lumn name was ro
1ba80 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22  wid", "oid" or "
1ba90 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20  _rowid_" .  **  
1baa0 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20        and there 
1bab0 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79  is no explicitly
1bac0 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f   declared IPK co
1bad0 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  lumn. .  **.  **
1bae0 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c       2. The tabl
1baf0 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
1bb00 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  and the column n
1bb10 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61  ame identified a
1bb20 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65  n .  **        e
1bb30 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
1bb40 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20  ed column. Copy 
1bb50 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
1bb60 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a   from *pCol..  *
1bb70 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b  / .  if( pCol ){
1bb80 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
1bb90 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
1bba0 70 65 28 70 43 6f 6c 2c 30 29 3b 0a 20 20 20 20  pe(pCol,0);.    
1bbb0 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
1bbc0 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
1bbd0 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  ull = pCol->notN
1bbe0 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d  ull!=0;.    prim
1bbf0 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d  arykey  = (pCol-
1bc00 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  >colFlags & COLF
1bc10 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b  LAG_PRIMKEY)!=0;
1bc20 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70  .    autoinc = p
1bc30 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c  Tab->iPKey==iCol
1bc40 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
1bc50 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
1bc60 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65  rement)!=0;.  }e
1bc70 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  lse{.    zDataTy
1bc80 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
1bc90 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d      primarykey =
1bca0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a   1;.  }.  if( !z
1bcb0 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a  CollSeq ){.    z
1bcc0 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74 65  CollSeq = sqlite
1bcd0 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a  3StrBINARY;.  }.
1bce0 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
1bcf0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
1bd00 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
1bd10 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
1bd20 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
1bd30 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
1bd40 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
1bd50 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
1bd60 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
1bd70 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
1bd80 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
1bd90 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
1bda0 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
1bdb0 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
1bdc0 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
1bdd0 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
1bde0 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
1bdf0 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
1be00 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
1be10 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
1be20 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
1be30 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
1be40 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
1be50 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
1be60 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
1be70 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
1be80 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
1be90 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
1bea0 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
1beb0 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
1bec0 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
1bed0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1bee0 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1bef0 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
1bf00 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1bf10 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
1bf20 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
1bf30 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
1bf40 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
1bf50 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
1bf60 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1bf70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
1bf80 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45  hMsg(db, rc, (zE
1bf90 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
1bfa0 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1bfb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1bfc0 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
1bfd0 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
1bfe0 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
1bff0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1c000 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1c010 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c   rc;.}../*.** Sl
1c020 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
1c030 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
1c040 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
1c050 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74  me slept..*/.int
1c060 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69   sqlite3_sleep(i
1c070 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65  nt ms){.  sqlite
1c080 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69  3_vfs *pVfs;.  i
1c090 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20  nt rc;.  pVfs = 
1c0a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1c0b0 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d  (0);.  if( pVfs=
1c0c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
1c0d0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
1c0e0 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c  on works in mill
1c0f0 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68  iseconds, but th
1c100 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53  e underlying OsS
1c110 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49  leep() .  ** API
1c120 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e   uses microsecon
1c130 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30  ds. Hence the 10
1c140 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  00's..  */.  rc 
1c150 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  = (sqlite3OsSlee
1c160 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29  p(pVfs, 1000*ms)
1c170 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  /1000);.  return
1c180 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
1c190 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
1c1a0 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73  the extended res
1c1b0 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e  ult codes..*/.in
1c1c0 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
1c1d0 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
1c1e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1c1f0 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66 20   onoff){.#ifdef 
1c200 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1c210 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1c220 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1c230 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
1c240 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1c250 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1c260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c270 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1c280 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e  db->errMask = on
1c290 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66  off ? 0xffffffff
1c2a0 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74   : 0xff;.  sqlit
1c2b0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1c2c0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
1c2d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1c2e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
1c2f0 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  he xFileControl 
1c300 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74  method on a part
1c310 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e  icular database.
1c320 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1c330 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c  file_control(sql
1c340 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1c350 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69  char *zDbName, i
1c360 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1c370 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1c380 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42  QLITE_ERROR;.  B
1c390 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23  tree *pBtree;..#
1c3a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c3b0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1c3c0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1c3d0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1c3e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1c3f0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1c400 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1c410 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1c420 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73  x);.  pBtree = s
1c430 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1c440 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1c450 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1c460 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
1c470 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
1c480 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73  _file *fd;.    s
1c490 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1c4a0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50  (pBtree);.    pP
1c4b0 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
1c4c0 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29  reePager(pBtree)
1c4d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1c4e0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66  ager!=0 );.    f
1c4f0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
1c500 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
1c510 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20    assert( fd!=0 
1c520 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
1c530 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
1c540 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1c550 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
1c560 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
1c570 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c580 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
1c590 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
1c5a0 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20 29  TL_VFS_POINTER )
1c5b0 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
1c5c0 33 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d 20 73  3_vfs**)pArg = s
1c5d0 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
1c5e0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1c5f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c600 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1c610 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55  SQLITE_FCNTL_JOU
1c620 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b 0a  RNAL_POINTER ){.
1c630 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f        *(sqlite3_
1c640 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73 71  file**)pArg = sq
1c650 6c 69 74 65 33 50 61 67 65 72 4a 72 6e 6c 46 69  lite3PagerJrnlFi
1c660 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
1c670 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c680 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c690 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1c6a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c6b0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
1c6c0 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  fd, op, pArg);. 
1c6d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c6e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
1c6f0 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OUND;.    }.    
1c700 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1c710 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
1c720 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c730 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1c740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c750 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1c760 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
1c770 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
1c780 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1c790 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
1c7a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
1c7b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54  ifdef SQLITE_UNT
1c7c0 45 53 54 41 42 4c 45 0a 20 20 55 4e 55 53 45 44  ESTABLE.  UNUSED
1c7d0 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a  _PARAMETER(op);.
1c7e0 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20  #else.  va_list 
1c7f0 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1c800 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
1c810 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
1c820 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
1c830 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1c840 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
1c850 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1c860 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1c870 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
1c880 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
1c890 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
1c8a0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c8b0 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
1c8c0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1c8d0 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
1c8e0 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
1c8f0 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
1c900 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
1c910 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
1c920 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
1c930 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1c940 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
1c950 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
1c960 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c970 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1c980 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
1c990 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
1c9a0 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
1c9b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c9c0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1c9d0 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
1c9e0 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
1c9f0 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
1ca00 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
1ca10 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
1ca20 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
1ca30 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
1ca40 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
1ca50 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
1ca60 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
1ca70 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
1ca80 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
1ca90 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1caa0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1cab0 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
1cac0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1cad0 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20  ess(0,0);.      
1cae0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1caf0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1cb00 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1cb10 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
1cb20 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
1cb30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
1cb40 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
1cb50 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
1cb60 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
1cb70 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
1cb80 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
1cb90 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
1cba0 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
1cbb0 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
1cbc0 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
1cbd0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
1cbe0 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
1cbf0 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
1cc00 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
1cc10 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
1cc20 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
1cc30 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
1cc40 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1cc50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1cc60 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1cc70 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
1cc80 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
1cc90 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1cca0 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
1ccb0 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
1ccc0 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
1ccd0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
1cce0 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
1ccf0 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
1cd00 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1cd10 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1cd20 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41  _test_control(FA
1cd30 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61  ULT_INSTALL, xCa
1cd40 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20  llback).    **. 
1cd50 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f     ** Arrange to
1cd60 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63   invoke xCallbac
1cd70 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c  k() whenever sql
1cd80 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69  ite3FaultSim() i
1cd90 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a  s called,.    **
1cda0 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73   if xCallback is
1cdb0 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
1cdc0 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65  *.    ** As a te
1cdd0 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20  st of the fault 
1cde0 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e  simulator mechan
1cdf0 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69  ism itself, sqli
1ce00 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20  te3FaultSim(0). 
1ce10 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20     ** is called 
1ce20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
1ce30 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65  r installing the
1ce40 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e   new callback an
1ce50 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20  d the return.   
1ce60 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73   ** value from s
1ce70 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1ce80 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65  ) becomes the re
1ce90 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  turn from.    **
1cea0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ceb0 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a  ntrol()..    */.
1cec0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ced0 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49  TESTCTRL_FAULT_I
1cee0 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  NSTALL: {.      
1cef0 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
1cf00 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
1cf10 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
1cf20 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
1cf30 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
1cf40 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
1cf50 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
1cf60 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cf70 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
1cf80 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  k = va_arg(ap, i
1cf90 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20  nt(*)(int));.   
1cfa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
1cfb0 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c  def int(*TESTCAL
1cfc0 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74  LBACKFUNC_t)(int
1cfd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cfe0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
1cff0 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
1d000 61 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c  arg(ap, TESTCALL
1d010 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20  BACKFUNC_t);.   
1d020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1d030 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20  aultSim(0);.    
1d040 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d050 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1d060 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d070 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
1d080 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
1d090 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
1d0a0 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
1d0b0 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
1d0c0 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
1d0d0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
1d0e0 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
1d0f0 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
1d100 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1d110 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
1d120 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
1d130 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1d140 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
1d150 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
1d160 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
1d170 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
1d180 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
1d190 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
1d1a0 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
1d1b0 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
1d1c0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
1d1d0 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
1d1e0 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
1d1f0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
1d200 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
1d210 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
1d220 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
1d230 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d240 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1d250 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1d260 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d270 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1d280 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
1d290 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1d2a0 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
1d2b0 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
1d2c0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
1d2d0 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
1d2e0 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
1d2f0 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
1d300 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
1d310 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
1d320 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
1d330 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
1d340 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1d350 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
1d360 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
1d370 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
1d380 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
1d390 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
1d3a0 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
1d3b0 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
1d3c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1d3d0 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
1d3e0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1d3f0 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
1d400 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
1d410 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
1d420 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
1d430 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
1d440 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  eleterious behav
1d450 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
1d460 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1d470 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
1d480 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
1d490 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
1d4a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d4b0 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
1d4c0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
1d4d0 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
1d4e0 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
1d4f0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
1d500 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
1d510 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
1d520 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
1d530 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1d540 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d550 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1d560 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1d570 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1d580 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
1d590 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1d5a0 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1d5b0 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1d5c0 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
1d5d0 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
1d5e0 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
1d5f0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1d600 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
1d610 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
1d620 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
1d630 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1d640 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
1d650 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
1d660 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
1d670 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
1d680 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
1d690 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
1d6a0 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
1d6b0 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1d6c0 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
1d6d0 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
1d6e0 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
1d6f0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
1d700 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
1d710 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
1d720 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
1d730 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1d740 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
1d750 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
1d760 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1d770 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
1d780 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
1d790 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
1d7a0 73 73 65 72 74 28 20 2f 2a 73 69 64 65 2d 65 66  ssert( /*side-ef
1d7b0 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20  fects-ok*/ (x = 
1d7c0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
1d7d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
1d7e0 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
1d7f0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1d800 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1d810 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1d820 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1d830 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
1d840 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1d850 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1d860 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1d870 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
1d880 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
1d890 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
1d8a0 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
1d8b0 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
1d8c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
1d8d0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
1d8e0 41 59 53 28 58 29 20 69 66 20 58 20 69 73 20 74  AYS(X) if X is t
1d8f0 72 75 65 2c 20 6f 72 20 30 20 69 66 20 58 20 69  rue, or 0 if X i
1d900 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 0a  s false..    **.
1d910 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d      ** The recom
1d920 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20 58  mended test is X
1d930 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65 74  ==2.  If the ret
1d940 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20  urn value is 2, 
1d950 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  that means.    *
1d960 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  * ALWAYS() and N
1d970 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68 20  EVER() are both 
1d980 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
1d990 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68  gh macros, which
1d9a0 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   is the.    ** d
1d9b0 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20  efault setting. 
1d9c0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
1d9d0 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20  alue is 1, then 
1d9e0 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74 68  ALWAYS() is eith
1d9f0 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63  er.    ** hard-c
1da00 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20  oded to true or 
1da10 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73 20  else it asserts 
1da20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  if its argument 
1da30 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1da40 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61 76   The first behav
1da50 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20  ior (hard-coded 
1da60 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65 20  to true) is the 
1da70 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
1da80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1da90 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
1daa0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1dab0 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65  abled and the se
1dac0 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61  cond.    ** beha
1dad0 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66 20  vior (assert if 
1dae0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1daf0 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c 73  ALWAYS() is fals
1db00 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
1db10 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
1db20 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
1db30 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
1db40 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  t() is enabled..
1db50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1db60 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  e run-time test 
1db70 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20  procedure might 
1db80 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c  look something l
1db90 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
1dba0 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73  .    **    if( s
1dbb0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1dbc0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1dbd0 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d  TRL_ALWAYS, 2)==
1dbe0 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  2 ){.    **     
1dbf0 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64   // ALWAYS() and
1dc00 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d   NEVER() are no-
1dc10 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
1dc20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20  macros.    **   
1dc30 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
1dc40 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1dc50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1dc60 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20  ASSERT, 1) ){.  
1dc70 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1dc80 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20 74  AYS(x) asserts t
1dc90 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e  hat x is true. N
1dca0 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73 20  EVER(x) asserts 
1dcb0 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  x is false..    
1dcc0 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  **    }else{.   
1dcd0 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
1dce0 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  YS(x) is a const
1dcf0 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29  ant 1.  NEVER(x)
1dd00 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30   is a constant 0
1dd10 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20  ..    **    }.  
1dd20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1dd30 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1dd40 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WAYS: {.      in
1dd50 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
1dd60 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
1dd70 20 78 20 3f 20 41 4c 57 41 59 53 28 78 29 20 3a   x ? ALWAYS(x) :
1dd80 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1dd90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1dda0 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f     **   sqlite3_
1ddb0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1ddc0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54  ITE_TESTCTRL_BYT
1ddd0 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a  EORDER);.    **.
1dde0 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67      ** The integ
1ddf0 65 72 20 72 65 74 75 72 6e 65 64 20 72 65 76 65  er returned reve
1de00 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64  als the byte-ord
1de10 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74  er of the comput
1de20 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  er on which.    
1de30 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e  ** SQLite is run
1de40 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ning:.    **.   
1de50 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20 20   **       1     
1de60 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64  big-endian,    d
1de70 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e  etermined at run
1de80 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20  -time.    **    
1de90 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d    10     little-
1dea0 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e  endian, determin
1deb0 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1dec0 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20     **  432101   
1ded0 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
1dee0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63   determined at c
1def0 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20  ompile-time.    
1df00 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20 20 6c  **  123410     l
1df10 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65  ittle-endian, de
1df20 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70  termined at comp
1df30 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20  ile-time.    */ 
1df40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1df50 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
1df60 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  DER: {.      rc 
1df70 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  = SQLITE_BYTEORD
1df80 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f  ER*100 + SQLITE_
1df90 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20  LITTLEENDIAN*10 
1dfa0 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49  + SQLITE_BIGENDI
1dfb0 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  AN;.      break;
1dfc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1dfd0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1dfe0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1dff0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73  TCTRL_RESERVE, s
1e000 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1e010 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
1e020 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76   Set the nReserv
1e030 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20  e size to N for 
1e040 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1e050 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
1e060 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  e.    ** connect
1e070 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20  ion db..    */. 
1e080 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1e090 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a  ESTCTRL_RESERVE:
1e0a0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e0b0 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1e0c0 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1e0d0 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
1e0e0 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1e0f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1e100 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1e110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1e120 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64  reeSetPageSize(d
1e130 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
1e140 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , x, 0);.      s
1e150 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1e160 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1e170 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e180 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
1e190 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e1a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e1b0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73  OPTIMIZATIONS, s
1e1c0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1e1d0 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
1e1e0 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
1e1f0 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  le various optim
1e200 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73  izations for tes
1e210 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
1e220 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75  The .    ** argu
1e230 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d  ment N is a bitm
1e240 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74  ask of optimizat
1e250 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62  ions to be disab
1e260 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c  led.  For normal
1e270 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
1e280 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e  n N should be 0.
1e290 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68    The idea is th
1e2a0 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61  at a test progra
1e2b0 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20  m (like the.    
1e2c0 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73  ** SQL Logic Tes
1e2d0 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f  t or SLT test mo
1e2e0 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68  dule) can run th
1e2f0 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69  e same SQL multi
1e300 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a  ple times.    **
1e310 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70   with various op
1e320 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61  timizations disa
1e330 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  bled to verify t
1e340 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73  hat the same ans
1e350 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62  wer.    ** is ob
1e360 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20  tained in every 
1e370 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
1e380 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e390 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
1e3a0 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ONS: {.      sql
1e3b0 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1e3c0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1e3d0 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74  .      db->dbOpt
1e3e0 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61  Flags = (u16)(va
1e3f0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20  _arg(ap, int) & 
1e400 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62  0xffff);.      b
1e410 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
1e420 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  def SQLITE_N_KEY
1e430 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69  WORD.    /* sqli
1e440 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e450 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e460 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73  _ISKEYWORD, cons
1e470 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20  t char *zWord). 
1e480 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1e490 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f  zWord is a keywo
1e4a0 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79  rd recognized by
1e4b0 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
1e4c0 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20  n return the.   
1e4d0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65   ** number of ke
1e4e0 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a  ywords.  Or if z
1e4f0 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65  Word is not a ke
1e500 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e  yword, return 0.
1e510 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
1e520 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72  This test featur
1e530 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
1e540 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67  ble in the amalg
1e550 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20  amation since.  
1e560 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
1e570 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20  N_KEYWORD macro 
1e580 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69  is not defined i
1e590 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53  n this file if S
1e5a0 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20  QLite.    ** is 
1e5b0 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61  built using sepa
1e5c0 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65  rate source file
1e5d0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
1e5e0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1e5f0 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a  RL_ISKEYWORD: {.
1e600 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1e610 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67   *zWord = va_arg
1e620 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
1e630 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
1e640 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e650 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72  (zWord);.      r
1e660 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77  c = (sqlite3Keyw
1e670 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f  ordCode((u8*)zWo
1e680 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f  rd, n)!=TK_ID) ?
1e690 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
1e6a0 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65  D : 0;.      bre
1e6b0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1e6c0 20 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69   ..    /*   sqli
1e6d0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e6e0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e6f0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
1e700 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20  , int onoff);.  
1e710 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
1e720 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69  arameter onoff i
1e730 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66  s non-zero, conf
1e740 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65  igure the wrappe
1e750 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20  rs so that all. 
1e760 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
1e770 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74   calls to localt
1e780 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e  ime() and varian
1e790 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66  ts fail. If onof
1e7a0 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a  f is zero,.    *
1e7b0 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74  * undo this sett
1e7c0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1e7d0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e7e0 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1e7f0 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  AULT: {.      sq
1e800 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e810 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c  g.bLocaltimeFaul
1e820 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
1e830 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
1e840 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e850 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1e860 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1e870 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1e880 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20  RUPT, int);.    
1e890 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72  **.    ** Set or
1e8a0 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68   clear a flag th
1e8b0 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
1e8c0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1e8d0 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65  ile is always we
1e8e0 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65  ll-.    ** forme
1e8f0 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72  d and never corr
1e900 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20  upt.  This flag 
1e910 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61  is clear by defa
1e920 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ult, indicating 
1e930 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61  that.    ** data
1e940 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74  base files might
1e950 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20   have arbitrary 
1e960 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74  corruption.  Set
1e970 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75  ting the flag du
1e980 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74  ring.    ** test
1e990 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61  ing causes certa
1e9a0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1e9b0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1e9c0 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74  de to be activat
1e9d0 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  ed.    ** that d
1e9e0 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69  emonstrat invari
1e9f0 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72  ants on well-for
1ea00 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
1ea10 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1ea20 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1ea30 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
1ea40 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1ea50 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1ea60 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61  everCorrupt = va
1ea70 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1ea80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ea90 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
1eaa0 65 20 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77  e threshold at w
1eab0 68 69 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75  hich OP_Once cou
1eac0 6e 74 65 72 73 20 72 65 73 65 74 20 62 61 63 6b  nters reset back
1ead0 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a   to zero..    **
1eae0 20 42 79 20 64 65 66 61 75 6c 74 20 74 68 69 73   By default this
1eaf0 20 69 73 20 30 78 37 66 66 66 66 66 66 65 20 28   is 0x7ffffffe (
1eb00 6f 76 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c  over 2 billion),
1eb10 20 62 75 74 20 74 68 61 74 20 76 61 6c 75 65 20   but that value 
1eb20 69 73 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69  is.    ** too bi
1eb30 67 20 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72  g to test in a r
1eb40 65 61 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74  easonable amount
1eb50 20 6f 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69   of time, so thi
1eb60 73 20 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20  s control is.   
1eb70 20 2a 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20   ** provided to 
1eb80 73 65 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20  set a small and 
1eb90 65 61 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65  easily reachable
1eba0 20 72 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20   reset value..  
1ebb0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ebc0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e  LITE_TESTCTRL_ON
1ebd0 43 45 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f  CE_RESET_THRESHO
1ebe0 4c 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LD: {.      sqli
1ebf0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ec00 69 4f 6e 63 65 52 65 73 65 74 54 68 72 65 73 68  iOnceResetThresh
1ec10 6f 6c 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  old = va_arg(ap,
1ec20 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1ec30 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1ec40 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1ec50 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1ec60 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1ec70 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63  VERAGE, xCallbac
1ec80 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a  k, ptr);.    **.
1ec90 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56      ** Set the V
1eca0 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c  DBE coverage cal
1ecb0 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
1ecc0 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68  o xCallback with
1ecd0 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a   context .    **
1ece0 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20   pointer ptr..  
1ecf0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ed00 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1ed10 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23  BE_COVERAGE: {.#
1ed20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
1ed30 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20  E_COVERAGE.     
1ed40 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1ed50 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1ed60 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38  (void*,int,u8,u8
1ed70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ed80 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64  GlobalConfig.xVd
1ed90 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72  beBranch = va_ar
1eda0 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c  g(ap,branch_call
1edb0 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  back);.      sql
1edc0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1edd0 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20  .pVdbeBranchArg 
1ede0 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64  = va_arg(ap,void
1edf0 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  *);.#endif.     
1ee00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1ee10 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1ee20 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1ee30 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1ee40 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d  TER_MMAP, db, nM
1ee50 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  ax); */.    case
1ee60 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ee70 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a  _SORTER_MMAP: {.
1ee80 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1ee90 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1eea0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1eeb0 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
1eec0 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
1eed0 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1eee0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1eef0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1ef00 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1ef10 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b  ESTCTRL_ISINIT);
1ef20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1ef30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1ef40 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65  if SQLite has be
1ef50 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
1ef60 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  nd SQLITE_ERROR 
1ef70 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20  if.    ** not.. 
1ef80 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1ef90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1efa0 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69  SINIT: {.      i
1efb0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1efc0 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
1efd0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
1efe0 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
1eff0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1f000 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1f010 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1f020 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
1f030 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f   db, dbName, onO
1f040 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a  ff, tnum);.    *
1f050 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65  *.    ** This te
1f060 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73  st control is us
1f070 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70  ed to create imp
1f080 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22  oster tables.  "
1f090 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  db" is a pointer
1f0a0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  .    ** to the d
1f0b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1f0c0 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74  on.  dbName is t
1f0d0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1f0e0 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a   (ex: "main" or.
1f0f0 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77      ** "temp") w
1f100 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76  hich will receiv
1f110 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20  e the imposter. 
1f120 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69   "onOff" turns i
1f130 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a  mposter mode on.
1f140 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20      ** or off.  
1f150 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f  "tnum" is the ro
1f160 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1f170 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74  -tree to which t
1f180 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20  he imposter.    
1f190 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ** table should 
1f1a0 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a  connect..    **.
1f1b0 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d      ** Enable im
1f1c0 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79  poster mode only
1f1d0 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
1f1e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1f1f0 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a  n parsed.  Then.
1f200 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e      ** run a sin
1f210 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  gle CREATE TABLE
1f220 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f   statement to co
1f230 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f  nstruct the impo
1f240 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20  ster table in.  
1f250 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20    ** the parsed 
1f260 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75  schema.  Then tu
1f270 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  rn imposter mode
1f280 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e   back off again.
1f290 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1f2a0 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74  f onOff==0 and t
1f2b0 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74  num>0 then reset
1f2c0 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
1f2d0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63  all databases, c
1f2e0 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  ausing.    ** th
1f2f0 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72  e schema to be r
1f300 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78 74  eparsed the next
1f310 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64   time it is need
1f320 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  ed.  This has th
1f330 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20  e.    ** effect 
1f340 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69  of erasing all i
1f350 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a  mposter tables..
1f360 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1f370 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f380 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
1f390 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f3a0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1f3b0 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e3*);.      sqli
1f3c0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1f3d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
1f3e0 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
1f3f0 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
1f400 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70  me(db, va_arg(ap
1f410 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a  ,const char*));.
1f420 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
1f430 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  usy = db->init.i
1f440 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76  mposterTable = v
1f450 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1f460 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65       db->init.ne
1f470 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61  wTnum = va_arg(a
1f480 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  p,int);.      if
1f490 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1f4a0 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  =0 && db->init.n
1f4b0 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20  ewTnum>0 ){.    
1f4c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
1f4d0 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
1f4e0 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
1f4f0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1f500 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1f510 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1f520 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1f530 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1f540 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f550 55 4e 54 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20  UNTESTABLE */.  
1f560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f570 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
1f580 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75  ility routine, u
1f590 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70  seful to VFS imp
1f5a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68  lementations, th
1f5b0 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20  at checks.** to 
1f5c0 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61 73  see if a databas
1f5d0 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52 49  e file was a URI
1f5e0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20   that contained 
1f5f0 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72 79  a specific query
1f600 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20   .** parameter, 
1f610 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e  and if so obtain
1f620 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1f630 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  he query paramet
1f640 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  er..**.** The zF
1f650 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
1f660 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   is the filename
1f670 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20   pointer passed 
1f680 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29  into the xOpen()
1f690 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20  .** method of a 
1f6a0 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1f6b0 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20  on.  The zParam 
1f6c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1f6d0 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71  name of the.** q
1f6e0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 77  uery parameter w
1f6f0 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f  e seek.  This ro
1f700 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1f710 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a  e value of the z
1f720 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74  Param.** paramet
1f730 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  er if it exists.
1f740 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74    If the paramet
1f750 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  er does not exis
1f760 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  t, this routine.
1f770 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c  ** returns a NUL
1f780 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f  L pointer..*/.co
1f790 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1f7a0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1f7b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1f7c0 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1f7d0 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66  r *zParam){.  if
1f7e0 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
1f7f0 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72 65  | zParam==0 ) re
1f800 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e  turn 0;.  zFilen
1f810 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
1f820 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
1f830 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  ) + 1;.  while( 
1f840 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
1f850 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63      int x = strc
1f860 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  mp(zFilename, zP
1f870 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65  aram);.    zFile
1f880 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1f890 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1f8a0 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  e) + 1;.    if( 
1f8b0 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46  x==0 ) return zF
1f8c0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69  ilename;.    zFi
1f8d0 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
1f8e0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
1f8f0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  ame) + 1;.  }.  
1f900 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1f910 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c  ** Return a bool
1f920 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ean value for a 
1f930 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1f940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1f950 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73  uri_boolean(cons
1f960 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1f970 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1f980 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74  Param, int bDflt
1f990 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1f9a0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
1f9b0 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65  _parameter(zFile
1f9c0 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1f9d0 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d   bDflt = bDflt!=
1f9e0 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20  0;.  return z ? 
1f9f0 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
1fa00 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44  n(z, bDflt) : bD
1fa10 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
1fa20 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e  turn a 64-bit in
1fa30 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
1fa40 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
1fa50 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  r..*/.sqlite3_in
1fa60 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  t64 sqlite3_uri_
1fa70 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63  int64(.  const c
1fa80 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1fa90 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
1faa0 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65  s passed to xOpe
1fab0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
1fac0 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20  r *zParam,      
1fad0 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65   /* URI paramete
1fae0 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71  r sought */.  sq
1faf0 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c  lite3_int64 bDfl
1fb00 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  t       /* retur
1fb10 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69  n if parameter i
1fb20 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a  s missing */.){.
1fb30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1fb40 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
1fb50 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
1fb60 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71  e, zParam);.  sq
1fb70 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
1fb80 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65   if( z && sqlite
1fb90 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
1fba0 2c 20 26 76 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , &v)==0 ){.    
1fbb0 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
1fbc0 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
1fbd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1fbe0 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
1fbf0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
1fc00 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
1fc10 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1fc20 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
1fc30 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1fc40 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1fc50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1fc60 6d 65 29 7b 0a 20 20 69 6e 74 20 69 44 62 20 3d  me){.  int iDb =
1fc70 20 7a 44 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74   zDbName ? sqlit
1fc80 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
1fc90 20 7a 44 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20   zDbName) : 0;. 
1fca0 20 72 65 74 75 72 6e 20 69 44 62 3c 30 20 3f 20   return iDb<0 ? 
1fcb0 30 20 3a 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 : db->aDb[iDb]
1fcc0 2e 70 42 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .pBt;.}../*.** R
1fcd0 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61  eturn the filena
1fce0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1fcf0 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
1fd00 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  th a database.**
1fd10 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1fd20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1fd30 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
1fd40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1fd50 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1fd60 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
1fd70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1fd80 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1fd90 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1fda0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1fdb0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
1fdc0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1fdd0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1fde0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20   }.#endif.  pBt 
1fdf0 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1fe00 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1fe10 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
1fe20 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
1fe30 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29  GetFilename(pBt)
1fe40 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   : 0;.}../*.** R
1fe50 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61 62  eturn 1 if datab
1fe60 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ase is read-only
1fe70 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77 72   or 0 if read/wr
1fe80 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ite.  Return -1 
1fe90 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61  if.** no such da
1fea0 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a  tabase exists..*
1feb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
1fec0 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65  _readonly(sqlite
1fed0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1fee0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1fef0 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65  tree *pBt;.#ifde
1ff00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ff10 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1ff20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1ff30 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
1ff40 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
1ff50 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
1ff60 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
1ff70 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c  ndif.  pBt = sql
1ff80 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1ff90 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
1ffa0 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73    return pBt ? s
1ffb0 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61  qlite3BtreeIsRea
1ffc0 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b  donly(pBt) : -1;
1ffd0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1ffe0 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
1fff0 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  T./*.** Obtain a
20000 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65   snapshot handle
20010 20 66 6f 72 20 74 68 65 20 73 6e 61 70 73 68 6f   for the snapsho
20020 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 7a 44  t of database zD
20030 62 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  b currently .** 
20040 62 65 69 6e 67 20 72 65 61 64 20 62 79 20 68 61  being read by ha
20050 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
20060 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
20070 5f 67 65 74 28 0a 20 20 73 71 6c 69 74 65 33 20  _get(.  sqlite3 
20080 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  *db, .  const ch
20090 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71 6c 69 74  ar *zDb,.  sqlit
200a0 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 2a 70 70  e3_snapshot **pp
200b0 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e  Snapshot.){.  in
200c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
200d0 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ROR;.#ifndef SQL
200e0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69  ITE_OMIT_WAL..#i
200f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
20100 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
20110 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
20120 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
20130 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20140 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
20150 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
20160 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
20170 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69  db->mutex);..  i
20180 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
20190 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
201a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
201b0 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
201c0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30  ;.    if( iDb==0
201d0 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   || iDb>1 ){.   
201e0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
201f0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
20200 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
20210 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
20220 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
20230 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20240 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
20250 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
20260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20290 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28 73 71  erSnapshotGet(sq
202a0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
202b0 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68 6f 74  pBt), ppSnapshot
202c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
202d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
202e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
202f0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
20300 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51  ;.#endif   /* SQ
20310 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
20320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20330 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65  ./*.** Open a re
20340 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad-transaction o
20350 6e 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 69  n the snapshot i
20360 64 65 6e 64 69 66 69 65 64 20 62 79 20 70 53 6e  dendified by pSn
20370 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73  apshot..*/.int s
20380 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
20390 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  open(.  sqlite3 
203a0 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  *db, .  const ch
203b0 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69  ar *zDb, .  sqli
203c0 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53  te3_snapshot *pS
203d0 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74  napshot.){.  int
203e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
203f0 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  OR;.#ifndef SQLI
20400 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66  TE_OMIT_WAL..#if
20410 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20420 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
20430 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
20440 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
20450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20460 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
20470 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
20480 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
20490 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
204a0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
204b0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44  =0 ){.    int iD
204c0 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
204d0 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
204e0 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
204f0 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31   iDb==0 || iDb>1
20500 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20   ){.      Btree 
20510 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
20520 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  Db].pBt;.      i
20530 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
20540 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
20550 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
20560 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20570 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71  rSnapshotOpen(sq
20580 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
20590 70 42 74 29 2c 20 70 53 6e 61 70 73 68 6f 74 29  pBt), pSnapshot)
205a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
205b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
205c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
205d0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
205e0 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20  rans(pBt, 0);.  
205f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20600 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e  agerSnapshotOpen
20610 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
20620 65 72 28 70 42 74 29 2c 20 30 29 3b 0a 20 20 20  er(pBt), 0);.   
20630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20640 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
20650 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20660 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
20670 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
20680 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
20690 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
206a0 20 52 65 63 6f 76 65 72 20 61 73 20 6d 61 6e 79   Recover as many
206b0 20 73 6e 61 70 73 68 6f 74 73 20 61 73 20 70 6f   snapshots as po
206c0 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
206d0 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  wal file associa
206e0 74 65 64 20 77 69 74 68 0a 2a 2a 20 73 63 68 65  ted with.** sche
206f0 6d 61 20 7a 44 62 20 6f 66 20 64 61 74 61 62 61  ma zDb of databa
20700 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  se db..*/.int sq
20710 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72  lite3_snapshot_r
20720 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33 20 2a  ecover(sqlite3 *
20730 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
20740 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  zDb){.  int rc =
20750 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
20760 20 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65   int iDb;.#ifnde
20770 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
20780 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  L..#ifdef SQLITE
20790 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
207a0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
207b0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
207c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
207d0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
207e0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
207f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20800 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
20810 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
20820 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
20830 7a 44 62 29 3b 0a 20 20 69 66 28 20 69 44 62 3d  zDb);.  if( iDb=
20840 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20  =0 || iDb>1 ){. 
20850 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
20860 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
20870 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
20880 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
20890 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  dTrans(pBt) ){. 
208a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
208b0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
208c0 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
208d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
208e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
208f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
20900 61 70 73 68 6f 74 52 65 63 6f 76 65 72 28 73 71  apshotRecover(sq
20910 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
20920 70 42 74 29 29 3b 0a 20 20 20 20 20 20 20 20 73  pBt));.        s
20930 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20940 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  t(pBt);.      }.
20950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
20960 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20970 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
20980 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
20990 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
209a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
209b0 20 46 72 65 65 20 61 20 73 6e 61 70 73 68 6f 74   Free a snapshot
209c0 20 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64   handle obtained
209d0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e   from sqlite3_sn
209e0 61 70 73 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f  apshot_get()..*/
209f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 6e  .void sqlite3_sn
20a00 61 70 73 68 6f 74 5f 66 72 65 65 28 73 71 6c 69  apshot_free(sqli
20a10 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53  te3_snapshot *pS
20a20 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69  napshot){.  sqli
20a30 74 65 33 5f 66 72 65 65 28 70 53 6e 61 70 73 68  te3_free(pSnapsh
20a40 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ot);.}.#endif /*
20a50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
20a60 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 6e  NAPSHOT */..#ifn
20a70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20a80 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
20a90 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  AGS./*.** Given 
20aa0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
20ab0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
20ac0 6e 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  n, return true i
20ad0 66 20 74 68 61 74 20 6f 70 74 69 6f 6e 0a 2a 2a  f that option.**
20ae0 20 77 61 73 20 75 73 65 64 20 61 6e 64 20 66 61   was used and fa
20af0 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  lse if not..**.*
20b00 2a 20 54 68 65 20 6e 61 6d 65 20 63 61 6e 20 6f  * The name can o
20b10 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69 6e 20  ptionally begin 
20b20 77 69 74 68 20 22 53 51 4c 49 54 45 5f 22 20 62  with "SQLITE_" b
20b30 75 74 20 74 68 65 20 22 53 51 4c 49 54 45 5f 22  ut the "SQLITE_"
20b40 20 70 72 65 66 69 78 0a 2a 2a 20 69 73 20 6e 6f   prefix.** is no
20b50 74 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  t required for a
20b60 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73   match..*/.int s
20b70 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
20b80 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e 73 74 20  tion_used(const 
20b90 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 29 7b  char *zOptName){
20ba0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
20bb0 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74  nt nOpt;.  const
20bc0 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c   char **azCompil
20bd0 65 4f 70 74 3b 0a 20 0a 23 69 66 20 53 51 4c 49  eOpt;. .#if SQLI
20be0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
20bf0 4d 4f 52 0a 20 20 69 66 28 20 7a 4f 70 74 4e 61  MOR.  if( zOptNa
20c00 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 28 76 6f  me==0 ){.    (vo
20c10 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
20c20 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
20c30 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
20c40 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 20  .  azCompileOpt 
20c50 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c 65  = sqlite3Compile
20c60 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a  Options(&nOpt);.
20c70 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
20c80 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c  rNICmp(zOptName,
20c90 20 22 53 51 4c 49 54 45 5f 22 2c 20 37 29 3d 3d   "SQLITE_", 7)==
20ca0 30 20 29 20 7a 4f 70 74 4e 61 6d 65 20 2b 3d 20  0 ) zOptName += 
20cb0 37 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  7;.  n = sqlite3
20cc0 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 4e 61 6d  Strlen30(zOptNam
20cd0 65 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20  e);..  /* Since 
20ce0 6e 4f 70 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  nOpt is normally
20cf0 20 69 6e 20 73 69 6e 67 6c 65 20 64 69 67 69 74   in single digit
20d00 73 2c 20 61 20 6c 69 6e 65 61 72 20 73 65 61 72  s, a linear sear
20d10 63 68 20 69 73 20 0a 20 20 2a 2a 20 61 64 65 71  ch is .  ** adeq
20d20 75 61 74 65 2e 20 4e 6f 20 6e 65 65 64 20 66 6f  uate. No need fo
20d30 72 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  r a binary searc
20d40 68 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  h. */.  for(i=0;
20d50 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b 29 7b 0a 20   i<nOpt; i++){. 
20d60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
20d70 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c  rNICmp(zOptName,
20d80 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d   azCompileOpt[i]
20d90 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  , n)==0.     && 
20da0 73 71 6c 69 74 65 33 49 73 49 64 43 68 61 72 28  sqlite3IsIdChar(
20db0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 61  (unsigned char)a
20dc0 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 5b 6e  zCompileOpt[i][n
20dd0 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ])==0.    ){.   
20de0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20df0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20e00 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
20e10 72 6e 20 74 68 65 20 4e 2d 74 68 20 63 6f 6d 70  rn the N-th comp
20e20 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
20e30 73 74 72 69 6e 67 2e 20 20 49 66 20 4e 20 69 73  string.  If N is
20e40 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 0a 2a   out of range,.*
20e50 2a 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20  * return a NULL 
20e60 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
20e70 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
20e80 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
20e90 74 28 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20  t(int N){.  int 
20ea0 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nOpt;.  const ch
20eb0 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70  ar **azCompileOp
20ec0 74 3b 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70  t;.  azCompileOp
20ed0 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69  t = sqlite3Compi
20ee0 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29  leOptions(&nOpt)
20ef0 3b 0a 20 20 69 66 28 20 4e 3e 3d 30 20 26 26 20  ;.  if( N>=0 && 
20f00 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20 20 20 72 65  N<nOpt ){.    re
20f10 74 75 72 6e 20 61 7a 43 6f 6d 70 69 6c 65 4f 70  turn azCompileOp
20f20 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t[N];.  }.  retu
20f30 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
20f40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
20f50 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
20f60 53 20 2a 2f 0a                                   S */.