/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 6275ece0699a957c4709a7ebe29476f132adbe459d18a6b497e234e4669abf91:


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 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 20 20 20 20 64 65 66 61 75  ES */..    defau
5de0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
5df0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e10: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
5e20: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
5e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
5e40: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62   the lookaside b
5e50: 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74  uffers for a dat
5e60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5e70: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
5e80: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
5e90: 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73  .  .** If lookas
5ea0: 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ide is already a
5eb0: 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51  ctive, return SQ
5ec0: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a  LITE_BUSY..**.**
5ed0: 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65   The sz paramete
5ee0: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5ef0: 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68  of bytes in each
5f00: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e   lookaside slot.
5f10: 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61  .** The cnt para
5f20: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5f30: 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49  ber of slots.  I
5f40: 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c  f pStart is NULL
5f50: 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f   the.** space fo
5f60: 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  r the lookaside 
5f70: 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e  memory is obtain
5f80: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
5f90: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20  malloc()..** If 
5fa0: 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55  pStart is not NU
5fb0: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a  LL then it is sz
5fc0: 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65  *cnt bytes of me
5fd0: 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a  mory to use for.
5fe0: 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  ** the lookaside
5ff0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
6000: 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b  ic int setupLook
6010: 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64  aside(sqlite3 *d
6020: 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  b, void *pBuf, i
6030: 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b  nt sz, int cnt){
6040: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6050: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20  OMIT_LOOKASIDE. 
6060: 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20   void *pStart;. 
6070: 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c   .  if( sqlite3L
6080: 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c  ookasideUsed(db,
6090: 30 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  0)>0 ){.    retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
60b0: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
60c0: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
60d0: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
60e0: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
60f0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
6100: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
6110: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
6120: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
6130: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
6140: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
6150: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
6160: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
6170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6180: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
6190: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
61a0: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
61b0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
61c0: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
61d0: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
61e0: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
61f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
6200: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
6210: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
6220: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
6230: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
6240: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
6250: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
6260: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
6270: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
6280: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
6290: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
62a0: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
62b0: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
62c0: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
62d0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
62e0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
62f0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
6300: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
6310: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
6320: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
6330: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
6340: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
6350: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
6360: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
6370: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
6380: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
6390: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
63a0: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
63b0: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
63c0: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
63d0: 69 64 65 2e 70 49 6e 69 74 20 3d 20 30 3b 0a 20  ide.pInit = 0;. 
63e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
63f0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
6400: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
6410: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
6420: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
6430: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
6440: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
6450: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
6460: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
6470: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 64 62 2d  lot*) );.    db-
6480: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74  >lookaside.nSlot
6490: 20 3d 20 63 6e 74 3b 0a 20 20 20 20 70 20 3d 20   = cnt;.    p = 
64a0: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
64b0: 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28  pStart;.    for(
64c0: 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69  i=cnt-1; i>=0; i
64d0: 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  --){.      p->pN
64e0: 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ext = db->lookas
64f0: 69 64 65 2e 70 49 6e 69 74 3b 0a 20 20 20 20 20  ide.pInit;.     
6500: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6510: 49 6e 69 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Init = p;.      
6520: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
6530: 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a  ot*)&((u8*)p)[sz
6540: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
6550: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
6560: 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = p;.    db->loo
6570: 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
6580: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 0;.    db->loo
6590: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
65a0: 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b   = pBuf==0 ?1:0;
65b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
65c0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
65d0: 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  rt = db;.    db-
65e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
65f0: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6600: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
6610: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
6620: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
6630: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
6640: 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d  ookaside.nSlot =
6650: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
6660: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
6670: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
6680: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
66a0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
66b0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
66c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
66d0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
66e0: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
66f0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
6700: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6710: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6720: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6730: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6740: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6750: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6760: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6770: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
6780: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
6790: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
67a0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
67b0: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
67c0: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
67d0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
67e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
67f0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6800: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6810: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
6820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6830: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6840: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6850: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6860: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6870: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6880: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6890: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
68a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
68b0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
68c0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
68d0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
68e0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
68f0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6900: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6910: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6920: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6940: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6950: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
6960: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6970: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6980: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6990: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
69a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
69c0: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
69d0: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
69e0: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
69f0: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6a00: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6a10: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
6a20: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6a30: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6a40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6a50: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
6a60: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
6a70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
6a80: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
6a90: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
6aa0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
6ab0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6ac0: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6ad0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6ae0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6af0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6b00: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6b10: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6b20: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6b40: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6b50: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6b60: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
6b70: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
6b80: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
6b90: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6ba0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6bb0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6bc0: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6bd0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6be0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6bf0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6c00: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6c10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6c20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6c30: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6c40: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6c50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6c60: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6c70: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6c80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6c90: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6ca0: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6cc0: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6cd0: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6ce0: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6cf0: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6d00: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6d10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6d20: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6d30: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6d40: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6d50: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6d60: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6d70: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6d80: 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20  MAINDBNAME: {.  
6d90: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36      /* IMP: R-06
6da0: 38 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20  824-28531 */.   
6db0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32     /* IMP: R-362
6dc0: 35 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20 20 20  57-52125 */.    
6dd0: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62    db->aDb[0].zDb
6de0: 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61  SName = va_arg(a
6df0: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  p,char*);.      
6e00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6e20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
6e30: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  TE_DBCONFIG_LOOK
6e40: 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76  ASIDE: {.      v
6e50: 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61  oid *pBuf = va_a
6e60: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f  rg(ap, void*); /
6e70: 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31  * IMP: R-26835-1
6e80: 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  0964 */.      in
6e90: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
6ea0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a  , int);       /*
6eb0: 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35   IMP: R-47871-25
6ec0: 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  994 */.      int
6ed0: 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70   cnt = va_arg(ap
6ee0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20  , int);      /* 
6ef0: 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33  IMP: R-04460-533
6f00: 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  86 */.      rc =
6f10: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
6f20: 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e  db, pBuf, sz, cn
6f30: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
6f40: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6f50: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
6f60: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
6f70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70  {.        int op
6f80: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ;      /* The op
6f90: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
6fa0: 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20  u32 mask;    /* 
6fb0: 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20  Mask of the bit 
6fc0: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73  in sqlite3.flags
6fd0: 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f   to set/clear */
6fe0: 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70  .      } aFlagOp
6ff0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
7000: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7010: 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20  _ENABLE_FKEY,   
7020: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46          SQLITE_F
7030: 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c  oreignKeys    },
7040: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7050: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7060: 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20 20  E_TRIGGER,      
7070: 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54    SQLITE_EnableT
7080: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
7090: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
70a0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33  NFIG_ENABLE_FTS3
70b0: 5f 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49  _TOKENIZER, SQLI
70c0: 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
70d0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
70e0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
70f0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
7100: 53 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61  SION, SQLITE_Loa
7110: 64 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20  dExtension  },. 
7120: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7130: 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
7140: 5f 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20  _ON_CLOSE,      
7150: 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43  SQLITE_NoCkptOnC
7160: 6c 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20  lose  },.       
7170: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7180: 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20  IG_ENABLE_QPSG, 
7190: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
71a0: 5f 45 6e 61 62 6c 65 51 50 53 47 20 20 20 20 20  _EnableQPSG     
71b0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
71c0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
71d0: 47 47 45 52 5f 45 51 50 2c 20 20 20 20 20 20 20  GGER_EQP,       
71e0: 20 20 20 20 53 51 4c 49 54 45 5f 54 72 69 67 67      SQLITE_Trigg
71f0: 65 72 45 51 50 20 20 20 20 20 7d 2c 0a 20 20 20  erEQP     },.   
7200: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7210: 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54  CONFIG_RESET_DAT
7220: 41 42 41 53 45 2c 20 20 20 20 20 20 20 20 53 51  ABASE,        SQ
7230: 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61  LITE_ResetDataba
7240: 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  se  },.      };.
7250: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
7260: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
7270: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
7280: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
7290: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
72a0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
72b0: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
72c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
72d0: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
72e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
72f0: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
7300: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
7310: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
7320: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
7330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  );.          u32
7340: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
7350: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
7360: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
7370: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7380: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
7390: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
73a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
73b0: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
73c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
73d0: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
73e0: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
73f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
7400: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
7410: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
7420: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
7430: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
7440: 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
7450: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7460: 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20  if( pRes ){.    
7470: 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
7480: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c  (db->flags & aFl
7490: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30  agOp[i].mask)!=0
74a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
74b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
74c0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
74d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
74e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
74f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7500: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
7510: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7520: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
7530: 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72  ue if the buffer
7540: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61   z[0..n-1] conta
7550: 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a  ins all spaces..
7560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
7570: 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68  lSpaces(const ch
7580: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
7590: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
75a0: 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d  [n-1]==' ' ){ n-
75b0: 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d  -; }.  return n=
75c0: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  =0;.}../*.** Thi
75d0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
75e0: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
75f0: 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52  ion named "BINAR
7600: 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  Y" which is alwa
7610: 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  ys.** available.
7620: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
7630: 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  dFlag argument i
7640: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
7650: 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74  space padding at
7660: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73   the end.** of s
7670: 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65  trings is ignore
7680: 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65  d.  This impleme
7690: 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f  nts the RTRIM co
76a0: 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  llation..*/.stat
76b0: 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75  ic int binCollFu
76c0: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46  nc(.  void *padF
76d0: 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  lag,.  int nKey1
76e0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
76f0: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
7700: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
7710: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
7720: 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
7730: 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
7740: 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44  nKey2;.  /* EVID
7750: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33  ENCE-OF: R-65033
7760: 2d 32 38 34 34 39 20 54 68 65 20 62 75 69 6c 74  -28449 The built
7770: 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  -in BINARY colla
7780: 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20  tion compares.  
7790: 2a 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65 20  ** strings byte 
77a0: 62 79 20 62 79 74 65 20 75 73 69 6e 67 20 74 68  by byte using th
77b0: 65 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74  e memcmp() funct
77c0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ion from the sta
77d0: 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62  ndard C.  ** lib
77e0: 72 61 72 79 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rary. */.  asser
77f0: 74 28 20 70 4b 65 79 31 20 26 26 20 70 4b 65 79  t( pKey1 && pKey
7800: 32 20 29 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  2 );.  rc = memc
7810: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
7820: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
7830: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46   ){.    if( padF
7840: 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  lag.     && allS
7850: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
7860: 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29  ey1)+n, nKey1-n)
7870: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
7880: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32  es(((char*)pKey2
7890: 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20  )+n, nKey2-n).  
78a0: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56    ){.      /* EV
78b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36  IDENCE-OF: R-316
78c0: 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20 69  24-24737 RTRIM i
78d0: 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65 78  s like BINARY ex
78e0: 63 65 70 74 20 74 68 61 74 20 65 78 74 72 61 0a  cept that extra.
78f0: 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73 20        ** spaces 
7900: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 69  at the end of ei
7910: 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20 6e  ther string do n
7920: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 72 65  ot change the re
7930: 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20  sult. In other. 
7940: 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73       ** words, s
7950: 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70  trings will comp
7960: 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65  are equal to one
7970: 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67   another as long
7980: 20 61 73 20 74 68 65 79 0a 20 20 20 20 20 20 2a   as they.      *
7990: 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e  * differ only in
79a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
79b0: 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64  paces at the end
79c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
79d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
79e0: 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
79f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7a00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7a10: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 43  Return true if C
7a20: 6f 6c 6c 53 65 71 20 69 73 20 74 68 65 20 64 65  ollSeq is the de
7a30: 66 61 75 6c 74 20 62 75 69 6c 74 2d 69 6e 20 42  fault built-in B
7a40: 49 4e 41 52 59 2e 0a 2a 2f 0a 69 6e 74 20 73 71  INARY..*/.int sq
7a50: 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 63 6f  lite3IsBinary(co
7a60: 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 29 7b  nst CollSeq *p){
7a70: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7a80: 7c 7c 20 70 2d 3e 78 43 6d 70 21 3d 62 69 6e 43  || p->xCmp!=binC
7a90: 6f 6c 6c 46 75 6e 63 20 7c 7c 20 70 2d 3e 70 55  ollFunc || p->pU
7aa0: 73 65 72 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ser!=0.         
7ab0: 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 2d 3e     || strcmp(p->
7ac0: 7a 4e 61 6d 65 2c 22 42 49 4e 41 52 59 22 29 3d  zName,"BINARY")=
7ad0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
7ae0: 3d 3d 30 20 7c 7c 20 28 70 2d 3e 78 43 6d 70 3d  ==0 || (p->xCmp=
7af0: 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 26 26 20  =binCollFunc && 
7b00: 70 2d 3e 70 55 73 65 72 3d 3d 30 29 3b 0a 7d 0a  p->pUser==0);.}.
7b10: 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62  ./*.** Another b
7b20: 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
7b30: 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41  g sequence: NOCA
7b40: 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SE. .**.** This 
7b50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7b60: 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ce is intended t
7b70: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63  o be used for "c
7b80: 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a  ase independent.
7b90: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20  ** comparison". 
7ba0: 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64  SQLite's knowled
7bb0: 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20  ge of upper and 
7bc0: 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76  lower case equiv
7bd0: 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64  alents.** extend
7be0: 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36  s only to the 26
7bf0: 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64   characters used
7c00: 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20   in the English 
7c10: 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  language..**.** 
7c20: 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68  At the moment th
7c30: 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54  ere is only a UT
7c40: 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  F-8 implementati
7c50: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
7c60: 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  t nocaseCollatin
7c70: 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  gFunc(.  void *N
7c80: 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
7c90: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
7ca0: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
7cb0: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
7cc0: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
7cd0: 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49  r = sqlite3StrNI
7ce0: 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73  Cmp(.      (cons
7cf0: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20  t char *)pKey1, 
7d00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b  (const char *)pK
7d10: 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79  ey2, (nKey1<nKey
7d20: 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b  2)?nKey1:nKey2);
7d30: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7d40: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
7d50: 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20  if( 0==r ){.    
7d60: 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b  r = nKey1-nKey2;
7d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
7d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7d90: 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68   the ROWID of th
7da0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e  e most recent in
7db0: 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69  sert.*/.sqlite_i
7dc0: 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73  nt64 sqlite3_las
7dd0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
7de0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
7df0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7e00: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
7e10: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
7e20: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
7e30: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
7e40: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
7e50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
7e60: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64  endif.  return d
7e70: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a  b->lastRowid;.}.
7e80: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
7e90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7ea0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73   the sqlite3_las
7eb0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
7ec0: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
7ed0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73  /.void sqlite3_s
7ee0: 65 74 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  et_last_insert_r
7ef0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
7f00: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
7f10: 69 52 6f 77 69 64 29 7b 0a 23 69 66 64 65 66 20  iRowid){.#ifdef 
7f20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
7f30: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
7f40: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
7f50: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
7f60: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
7f70: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
7f80: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
7f90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7fa0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
7fb0: 3b 0a 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  ;.  db->lastRowi
7fc0: 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 73 71  d = iRowid;.  sq
7fd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7fe0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
7ff0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8000: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
8010: 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20  ges in the most 
8020: 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73  recent call to s
8030: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a  qlite3_exec()..*
8040: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68  /.int sqlite3_ch
8050: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
8060: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
8070: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
8080: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
8090: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
80a0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
80b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
80c0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
80d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
80e0: 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67  eturn db->nChang
80f0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
8100: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8110: 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74   changes since t
8120: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
8130: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a  le was opened..*
8140: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  /.int sqlite3_to
8150: 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  tal_changes(sqli
8160: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
8170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
8180: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
8190: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
81a0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
81b0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
81c0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
81d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
81e0: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
81f0: 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a  nTotalChange;.}.
8200: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
8210: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
8220: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
8230: 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73  only manipulates
8240: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a   fields of the.*
8250: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
8260: 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65  e object, it doe
8270: 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20  s not close any 
8280: 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20  savepoints that 
8290: 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61  may be open.** a
82a0: 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67  t the b-tree/pag
82b0: 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69  er level..*/.voi
82c0: 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61  d sqlite3CloseSa
82d0: 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33  vepoints(sqlite3
82e0: 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20   *db){.  while( 
82f0: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29  db->pSavepoint )
8300: 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20  {.    Savepoint 
8310: 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76  *pTmp = db->pSav
8320: 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e  epoint;.    db->
8330: 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d  pSavepoint = pTm
8340: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  p->pNext;.    sq
8350: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8360: 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  pTmp);.  }.  db-
8370: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
8380: 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  .  db->nStatemen
8390: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54  t = 0;.  db->isT
83a0: 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
83b0: 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  int = 0;.}../*.*
83c0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  * Invoke the des
83d0: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
83e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
83f0: 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61   FuncDef p, if a
8400: 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69  ny. Except,.** i
8410: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
8420: 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74  e last copy of t
8430: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20  he function, do 
8440: 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d  not invoke it. M
8450: 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65  ultiple.** copie
8460: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75  s of a single fu
8470: 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74  nction are creat
8480: 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66  ed when create_f
8490: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  unction() is cal
84a0: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
84b0: 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e  TE_ANY as the en
84c0: 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  coding..*/.stati
84d0: 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44  c void functionD
84e0: 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a  estroy(sqlite3 *
84f0: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b  db, FuncDef *p){
8500: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
8510: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d  r *pDestructor =
8520: 20 70 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f   p->u.pDestructo
8530: 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75  r;.  if( pDestru
8540: 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73  ctor ){.    pDes
8550: 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b  tructor->nRef--;
8560: 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75  .    if( pDestru
8570: 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ctor->nRef==0 ){
8580: 0a 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74  .      pDestruct
8590: 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65  or->xDestroy(pDe
85a0: 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44  structor->pUserD
85b0: 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ata);.      sqli
85c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
85d0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
85e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
85f0: 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71  isconnect all sq
8600: 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63  lite3_vtab objec
8610: 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
8620: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  o database conne
8630: 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69  ction.** db. Thi
8640: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
8650: 20 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f   db is being clo
8660: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
8670: 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  oid disconnectAl
8680: 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64  lVtab(sqlite3 *d
8690: 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b){.#ifndef SQLI
86a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
86b0: 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ABLE.  int i;.  
86c0: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73  HashElem *p;.  s
86d0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
86e0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
86f0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
8700: 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20  ++){.    Schema 
8710: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
8720: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[i].pSchema;. 
8730: 20 20 20 69 66 28 20 70 53 63 68 65 6d 61 20 29     if( pSchema )
8740: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71  {.      for(p=sq
8750: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
8760: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
8770: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
8780: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20  hNext(p)){.     
8790: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
87a0: 20 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65   (Table *)sqlite
87b0: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
87c0: 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
87d0: 61 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74  al(pTab) ) sqlit
87e0: 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74  e3VtabDisconnect
87f0: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
8800: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8810: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
8820: 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75  First(&db->aModu
8830: 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  le); p; p=sqlite
8840: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
8850: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d    Module *pMod =
8860: 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74   (Module *)sqlit
8870: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
8880: 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f    if( pMod->pEpo
8890: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
88a0: 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65  ite3VtabDisconne
88b0: 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70  ct(db, pMod->pEp
88c0: 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oTab);.    }.  }
88d0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
88e0: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20  lockList(db);.  
88f0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
8900: 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a  eAll(db);.#else.
8910: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8920: 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d  ER(db);.#endif.}
8930: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
8940: 52 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20  RUE if database 
8950: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
8960: 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72  s unfinalized pr
8970: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
8980: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
8990: 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ed sqlite3_backu
89a0: 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a  p objects.  .*/.
89b0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65  static int conne
89c0: 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69  ctionIsBusy(sqli
89d0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
89e0: 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  j;.  assert( sql
89f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8a00: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
8a10: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20  if( db->pVdbe ) 
8a20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28  return 1;.  for(
8a30: 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20  j=0; j<db->nDb; 
8a40: 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  j++){.    Btree 
8a50: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a  *pBt = db->aDb[j
8a60: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
8a70: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
8a80: 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74  eeIsInBackup(pBt
8a90: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
8aa0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
8ab0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
8ac0: 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20  existing SQLite 
8ad0: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74  database.*/.stat
8ae0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c  ic int sqlite3Cl
8af0: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ose(sqlite3 *db,
8b00: 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65   int forceZombie
8b10: 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  ){.  if( !db ){.
8b20: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
8b30: 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37 34  OF: R-63257-1174
8b40: 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  0 Calling sqlite
8b50: 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20  3_close() or.   
8b60: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   ** sqlite3_clos
8b70: 65 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e 55  e_v2() with a NU
8b80: 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75 6d  LL pointer argum
8b90: 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ent is a harmles
8ba0: 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20  s no-op. */.    
8bb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8bc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
8bd0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
8be0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
8bf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8c00: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
8c10: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
8c20: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
8c30: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54  x);.  if( db->mT
8c40: 72 61 63 65 20 26 20 53 51 4c 49 54 45 5f 54 52  race & SQLITE_TR
8c50: 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20 20  ACE_CLOSE ){.   
8c60: 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c 49   db->xTrace(SQLI
8c70: 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 2c 20  TE_TRACE_CLOSE, 
8c80: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 64  db->pTraceArg, d
8c90: 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b, 0);.  }..  /*
8ca0: 20 46 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e 65   Force xDisconne
8cb0: 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20  ct calls on all 
8cc0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a  virtual tables *
8cd0: 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  /.  disconnectAl
8ce0: 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a  lVtab(db);..  /*
8cf0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
8d00: 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 64  n is open, the d
8d10: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
8d20: 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20  () call above.  
8d30: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65  ** will not have
8d40: 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73   called the xDis
8d50: 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64  connect() method
8d60: 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a   on any virtual.
8d70: 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74    ** tables in t
8d80: 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d  he db->aVTrans[]
8d90: 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c   array. The foll
8da0: 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61  owing sqlite3Vta
8db0: 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a  bRollback().  **
8dc0: 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f   call will do so
8dd0: 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20  . We need to do 
8de0: 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65 20  this before the 
8df0: 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65  check for active
8e00: 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
8e10: 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74  ents below, as t
8e20: 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65  he v-table imple
8e30: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65  mentation may be
8e40: 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f   storing.  ** so
8e50: 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  me prepared stat
8e60: 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c  ements internall
8e70: 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
8e80: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
8e90: 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20  );..  /* Legacy 
8ea0: 62 65 68 61 76 69 6f 72 20 28 73 71 6c 69 74 65  behavior (sqlite
8eb0: 33 5f 63 6c 6f 73 65 28 29 20 62 65 68 61 76 69  3_close() behavi
8ec0: 6f 72 29 20 69 73 20 74 6f 20 72 65 74 75 72 6e  or) is to return
8ed0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  .  ** SQLITE_BUS
8ee0: 59 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  Y if the connect
8ef0: 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20 63  ion can not be c
8f00: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
8f10: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 66  y..  */.  if( !f
8f20: 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f  orceZombie && co
8f30: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64  nnectionIsBusy(d
8f40: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
8f50: 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
8f60: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22  , SQLITE_BUSY, "
8f70: 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20  unable to close 
8f80: 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a  due to unfinaliz
8f90: 65 64 20 22 0a 20 20 20 20 20 20 20 22 73 74 61  ed ".       "sta
8fa0: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
8fb0: 69 73 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b  ished backups");
8fc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
8fd0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8fe0: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ex);.    return 
8ff0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
9000: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9010: 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
9020: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
9030: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
9040: 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e  ){.    /* Closin
9050: 67 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f  g the handle. Fo
9060: 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  urth parameter i
9070: 73 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c  s passed the val
9080: 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ue 2. */.    sql
9090: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
90a0: 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33  .xSqllog(sqlite3
90b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
90c0: 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20  llogArg, db, 0, 
90d0: 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  2);.  }.#endif..
90e0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
90f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f   connection into
9100: 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68   a zombie and th
9110: 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a  en close it..  *
9120: 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  /.  db->magic = 
9130: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
9140: 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65  BIE;.  sqlite3Le
9150: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
9160: 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65  Zombie(db);.  re
9170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9180: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72  }../*.** Two var
9190: 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70  iations on the p
91a0: 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20  ublic interface 
91b0: 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61  for closing a da
91c0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
91d0: 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65  tion. The sqlite
91e0: 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f  3_close() versio
91f0: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
9200: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61  _BUSY and.** lea
9210: 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ves the connecti
9220: 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65  on option if the
9230: 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a  re are unfinaliz
9240: 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ed prepared.** s
9250: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
9260: 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f  inished sqlite3_
9270: 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71  backups.  The sq
9280: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
9290: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63  .** version forc
92a0: 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  es the connectio
92b0: 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f  n to become a zo
92c0: 6d 62 69 65 20 69 66 20 74 68 65 72 65 20 61 72  mbie if there ar
92d0: 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65  e.** unclosed re
92e0: 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72  sources, and arr
92f0: 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f  anges for deallo
9300: 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  cation when the 
9310: 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20  last.** prepare 
9320: 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c  statement or sql
9330: 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73  ite3_backup clos
9340: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
9350: 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33  e3_close(sqlite3
9360: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
9370: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29  lite3Close(db,0)
9380: 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ; }.int sqlite3_
9390: 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33  close_v2(sqlite3
93a0: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
93b0: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29  lite3Close(db,1)
93c0: 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ; }.../*.** Clos
93d0: 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  e the mutex on d
93e0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
93f0: 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72  on db..**.** Fur
9400: 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74  thermore, if dat
9410: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9420: 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20   db is a zombie 
9430: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68  (meaning that th
9440: 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ere.** has been 
9450: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
9460: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
9470: 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ) or sqlite3_clo
9480: 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a  se_v2(db)) and.*
9490: 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f  * every sqlite3_
94a0: 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65  stmt has now bee
94b0: 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
94c0: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61  every sqlite3_ba
94d0: 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69  ckup has.** fini
94e0: 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20  shed, then free 
94f0: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  all resources..*
9500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65  /.void sqlite3Le
9510: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
9520: 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a  Zombie(sqlite3 *
9530: 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  db){.  HashElem 
9540: 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *i;             
9550: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
9560: 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f  able iterator */
9570: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
9580: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
9590: 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33  standing sqlite3
95a0: 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33  _stmt or sqlite3
95b0: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a  _backup objects.
95c0: 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63    ** or if the c
95d0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f  onnection has no
95e0: 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65  t yet been close
95f0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d by sqlite3_clo
9600: 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68  se_v2(),.  ** th
9610: 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68  en just leave th
9620: 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75  e mutex and retu
9630: 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  rn..  */.  if( d
9640: 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45  b->magic!=SQLITE
9650: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c  _MAGIC_ZOMBIE ||
9660: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
9670: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
9680: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9690: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
96a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
96b0: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
96c0: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
96d0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ans that the dat
96e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
96f0: 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64   has.  ** closed
9700: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d   all sqlite3_stm
9710: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61  t and sqlite3_ba
9720: 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64  ckup objects and
9730: 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70   has been.  ** p
9740: 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
9750: 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20  _close (meaning 
9760: 74 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d  that it is a zom
9770: 62 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65  bie).  Therefore
9780: 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20  ,.  ** go ahead 
9790: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73  and free all res
97a0: 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20  ources..  */..  
97b0: 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  /* If a transact
97c0: 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c  ion is open, rol
97d0: 6c 20 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20  l it back. This 
97e0: 61 6c 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61  also ensures tha
97f0: 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61  t if.  ** any da
9800: 74 61 62 61 73 65 20 73 63 68 65 6d 61 73 20 68  tabase schemas h
9810: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
9820: 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74  d by an uncommit
9830: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ted transaction.
9840: 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65    ** they are re
9850: 73 65 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68  set. And that th
9860: 65 20 72 65 71 75 69 72 65 64 20 62 2d 74 72 65  e required b-tre
9870: 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20  e mutex is held 
9880: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65  to make.  ** the
9890: 20 70 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20   pager rollback 
98a0: 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74  and schema reset
98b0: 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61   an atomic opera
98c0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  tion. */.  sqlit
98d0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
98e0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20  , SQLITE_OK);.. 
98f0: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74   /* Free any out
9900: 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69  standing Savepoi
9910: 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a  nt structures. *
9920: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  /.  sqlite3Close
9930: 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
9940: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
9950: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9960: 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d  ions */.  for(j=
9970: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
9980: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
9990: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
99a0: 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[j];.    if( pD
99b0: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
99c0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
99d0: 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pDb->pBt);.   
99e0: 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b     pDb->pBt = 0;
99f0: 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20  .      if( j!=1 
9a00: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
9a10: 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  pSchema = 0;.   
9a20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9a30: 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45   /* Clear the TE
9a40: 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61 72 61  MP schema separa
9a50: 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f  tely and last */
9a60: 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
9a70: 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
9a80: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
9a90: 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ear(db->aDb[1].p
9aa0: 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73  Schema);.  }.  s
9ab0: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
9ac0: 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  List(db);..  /* 
9ad0: 46 72 65 65 20 75 70 20 74 68 65 20 61 72 72 61  Free up the arra
9ae0: 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64  y of auxiliary d
9af0: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71  atabases */.  sq
9b00: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
9b10: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
9b20: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44    assert( db->nD
9b30: 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  b<=2 );.  assert
9b40: 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61  ( db->aDb==db->a
9b50: 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f  DbStatic );..  /
9b60: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20  * Tell the code 
9b70: 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74  in notify.c that
9b80: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9b90: 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20  no longer holds 
9ba0: 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61  any.  ** locks a
9bb0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  nd does not requ
9bc0: 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20  ire any further 
9bd0: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
9be0: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
9bf0: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
9c00: 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20  nClosed(db);..  
9c10: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
9c20: 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63  First(&db->aFunc
9c30: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
9c40: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
9c50: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
9c60: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
9c70: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
9c80: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66 75 6e     do{.      fun
9c90: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
9ca0: 20 70 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74   p);.      pNext
9cb0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
9cc0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9cd0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  (db, p);.      p
9ce0: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 77   = pNext;.    }w
9cf0: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a 20  hile( p );.  }. 
9d00: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
9d10: 72 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a 20  r(&db->aFunc);. 
9d20: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9d30: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
9d40: 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69  lSeq); i; i=sqli
9d50: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9d60: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9d70: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
9d80: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9d90: 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  );.    /* Invoke
9da0: 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73   any destructors
9db0: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
9dc0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9dd0: 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f  ce user data. */
9de0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
9df0: 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  3; j++){.      i
9e00: 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c  f( pColl[j].xDel
9e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
9e20: 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b  l[j].xDel(pColl[
9e30: 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  j].pUser);.     
9e40: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
9e50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9e60: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Coll);.  }.  sql
9e70: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
9e80: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
9e90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9ea0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
9eb0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9ec0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
9ed0: 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ule); i; i=sqlit
9ee0: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
9ef0: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
9f00: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
9f10: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
9f20: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65     if( pMod->xDe
9f30: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70  stroy ){.      p
9f40: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d  Mod->xDestroy(pM
9f50: 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  od->pAux);.    }
9f60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
9f70: 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c  EponymousTableCl
9f80: 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ear(db, pMod);. 
9f90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9fa0: 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a  (db, pMod);.  }.
9fb0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
9fc0: 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  ar(&db->aModule)
9fd0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
9fe0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
9ff0: 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c  ITE_OK); /* Deal
a000: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
a010: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
a020: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61  . */.  sqlite3Va
a030: 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72  lueFree(db->pErr
a040: 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  );.  sqlite3Clos
a050: 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  eExtensions(db);
a060: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
a070: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
a080: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
a090: 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65  b->auth.zAuthUse
a0a0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
a0b0: 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74  ee(db->auth.zAut
a0c0: 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  hPW);.#endif..  
a0d0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
a0e0: 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a  TE_MAGIC_ERROR;.
a0f0: 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64  .  /* The temp-d
a100: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69  atabase schema i
a110: 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66  s allocated diff
a120: 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65  erently from the
a130: 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20   other schema.  
a140: 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e  ** objects (usin
a150: 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  g sqliteMalloc()
a160: 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
a170: 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ad of sqlite3Btr
a180: 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a  eeSchema())..  *
a190: 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  * So it needs to
a1a0: 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20   be freed here. 
a1b0: 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f  Todo: Why not ro
a1c0: 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65  ll the temp sche
a1d0: 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  ma into.  ** the
a1e0: 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c   same sqliteMall
a1f0: 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20  oc() as the one 
a200: 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74  that allocates t
a210: 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a  he database .  *
a220: 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a  * structure?.  *
a230: 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
a240: 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d  e(db, db->aDb[1]
a250: 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  .pSchema);.  sql
a260: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a270: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
a280: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
a290: 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a  E_MAGIC_CLOSED;.
a2a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a2b0: 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  free(db->mutex);
a2c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a2d0: 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28  e3LookasideUsed(
a2e0: 64 62 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 69 66  db,0)==0 );.  if
a2f0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
a300: 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  bMalloced ){.   
a310: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a320: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
a330: 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rt);.  }.  sqlit
a340: 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a  e3_free(db);.}..
a350: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
a360: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
a370: 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20  s.  If tripCode 
a380: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
a390: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72  , then.** any wr
a3a0: 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
a3b0: 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72  invalidated ("tr
a3c0: 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22  ipped" - as in "
a3d0: 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75  tripping a circu
a3e0: 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20  it.** breaker") 
a3f0: 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75  and made to retu
a400: 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74  rn tripCode if t
a410: 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72  here are any fur
a420: 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73  ther.** attempts
a430: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72   to use that cur
a440: 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f  sor.  Read curso
a450: 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61  rs remain open a
a460: 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20  nd valid.** but 
a470: 61 72 65 20 22 73 61 76 65 64 22 20 69 6e 20 63  are "saved" in c
a480: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 70 61  ase the table pa
a490: 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72  ges are moved ar
a4a0: 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ound..*/.void sq
a4b0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
a4c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
a4d0: 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
a4e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72  nt i;.  int inTr
a4f0: 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ans = 0;.  int s
a500: 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61  chemaChange;.  a
a510: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a520: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
a530: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
a540: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
a550: 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61  oc();..  /* Obta
a560: 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75  in all b-tree mu
a570: 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b  texes before mak
a580: 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  ing any calls to
a590: 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
a5a0: 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  . .  ** This is 
a5b0: 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73  important in cas
a5c0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
a5d0: 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  n being rolled b
a5e0: 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64  ack has.  ** mod
a5f0: 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
a600: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68  se schema. If th
a610: 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  e b-tree mutexes
a620: 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20   are not taken. 
a630: 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61   ** here, then a
a640: 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61  nother shared-ca
a650: 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  che connection m
a660: 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65  ight sneak in be
a670: 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64  tween.  ** the d
a680: 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b  atabase rollback
a690: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
a6a0: 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75  t, which can cau
a6b0: 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f  se false.  ** co
a6c0: 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73  rruption reports
a6d0: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20   in some cases. 
a6e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
a6f0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
a700: 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d    schemaChange =
a710: 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26   (db->mDbFlags &
a720: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
a730: 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62 2d 3e  ange)!=0 && db->
a740: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20  init.busy==0;.. 
a750: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
a760: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
a770: 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44  tree *p = db->aD
a780: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
a790: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( p ){.      if(
a7a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
a7b0: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
a7c0: 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31       inTrans = 1
a7d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7e0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
a7f0: 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65  back(p, tripCode
a800: 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29  , !schemaChange)
a810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
a820: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
a830: 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  k(db);.  sqlite3
a840: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
a850: 29 3b 0a 0a 20 20 69 66 28 20 73 63 68 65 6d 61  );..  if( schema
a860: 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 73 71  Change ){.    sq
a870: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
a880: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
a890: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
a8a0: 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
a8b0: 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29  OfConnection(db)
a8c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
a8d0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
a8e0: 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65  ;..  /* Any defe
a8f0: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
a900: 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20  violations have 
a910: 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  now been resolve
a920: 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66  d. */.  db->nDef
a930: 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
a940: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
a950: 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d  mCons = 0;.  db-
a960: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
a970: 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f  E_DeferFKs;..  /
a980: 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * If one has bee
a990: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e  n configured, in
a9a0: 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  voke the rollbac
a9b0: 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20  k-hook callback 
a9c0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f  */.  if( db->xRo
a9d0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26  llbackCallback &
a9e0: 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64  & (inTrans || !d
a9f0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29  b->autoCommit) )
aa00: 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  {.    db->xRollb
aa10: 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ackCallback(db->
aa20: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20  pRollbackArg);. 
aa30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
aa40: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
aa50: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
aa60: 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  e name correspon
aa70: 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f  ding to the erro
aa80: 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66  r code.** specif
aa90: 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ied in the argum
aaa0: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ent..*/.#if defi
aab0: 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45 45 44 5f  ned(SQLITE_NEED_
aac0: 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73 74 20  ERR_NAME).const 
aad0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
aae0: 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20  Name(int rc){.  
aaf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ab00: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
ab10: 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66  origRc = rc;.  f
ab20: 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a  or(i=0; i<2 && z
ab30: 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63  Name==0; i++, rc
ab40: 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73   &= 0xff){.    s
ab50: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
ab60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
ab70: 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K:              
ab80: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ab90: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
aba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
abb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
abc0: 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20  ERROR:          
abd0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
abe0: 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20  ITE_ERROR";     
abf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ac00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ac10: 5f 45 52 52 4f 52 5f 53 4e 41 50 53 48 4f 54 3a  _ERROR_SNAPSHOT:
ac20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ac30: 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e 41 50 53  LITE_ERROR_SNAPS
ac40: 48 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  HOT";    break;.
ac50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ac60: 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20  E_INTERNAL:     
ac70: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ac80: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b  QLITE_INTERNAL";
ac90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
aca0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
acb0: 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20  TE_PERM:        
acc0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
acd0: 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20  SQLITE_PERM";   
ace0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
acf0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ad00: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
ad10: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ad20: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20  "SQLITE_ABORT"; 
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ad40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ad50: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
ad60: 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ACK:     zName =
ad70: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52   "SQLITE_ABORT_R
ad80: 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65  OLLBACK";    bre
ad90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ada0: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
adb0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
adc0: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b  = "SQLITE_BUSY";
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
ade0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
adf0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f  SQLITE_BUSY_RECO
ae00: 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65  VERY:      zName
ae10: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
ae20: 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62  RECOVERY";     b
ae30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ae40: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41   SQLITE_BUSY_SNA
ae50: 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d  PSHOT:      zNam
ae60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
ae70: 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20  _SNAPSHOT";     
ae80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ae90: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
aeb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
aec0: 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20  KED";           
aed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aee0: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
aef0: 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e  _SHAREDCACHE: zN
af00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
af10: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
af20: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
af30: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
af40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
af50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
af60: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20  OMEM";          
af70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
af80: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
af90: 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20  ONLY:           
afa0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
afb0: 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20  READONLY";      
afc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
afd0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
afe0: 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20  DONLY_RECOVERY: 
aff0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b000: 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45  _READONLY_RECOVE
b010: 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  RY"; break;.    
b020: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
b030: 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3a  ADONLY_CANTINIT:
b040: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b050: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49  E_READONLY_CANTI
b060: 4e 49 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  NIT"; break;.   
b070: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
b080: 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
b090: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
b0a0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
b0b0: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
b0c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b0d0: 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
b0e0: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
b0f0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
b100: 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  OVED";  break;. 
b110: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b120: 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54  _READONLY_DIRECT
b130: 4f 52 59 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ORY: zName = "SQ
b140: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 49  LITE_READONLY_DI
b150: 52 45 43 54 4f 52 59 22 3b 62 72 65 61 6b 3b 0a  RECTORY";break;.
b160: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b170: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20  E_INTERRUPT:    
b180: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b190: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22  QLITE_INTERRUPT"
b1a0: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
b1b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b1c0: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20  TE_IOERR:       
b1d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b1e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
b1f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b200: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b210: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20  ITE_IOERR_READ: 
b220: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b230: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  "SQLITE_IOERR_RE
b240: 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AD";        brea
b250: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b260: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
b270: 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  _READ:   zName =
b280: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b290: 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65  HORT_READ";  bre
b2a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b2b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
b2c0: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
b2d0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b2e0: 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72  WRITE";       br
b2f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b300: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
b310: 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  NC:        zName
b320: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b330: 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62  _FSYNC";       b
b340: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b350: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
b360: 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d  R_FSYNC:    zNam
b370: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b380: 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20  R_DIR_FSYNC";   
b390: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b3a0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
b3b0: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61  RUNCATE:     zNa
b3c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b3d0: 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20  RR_TRUNCATE";   
b3e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b3f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b400: 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e  FSTAT:        zN
b410: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b420: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
b430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b440: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b450: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _UNLOCK:       z
b460: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b470: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20  OERR_UNLOCK";   
b480: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b490: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b4a0: 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_RDLOCK:       
b4b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b4c0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20  IOERR_RDLOCK";  
b4d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b4e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b4f0: 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20  RR_DELETE:      
b500: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b510: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20  _IOERR_DELETE"; 
b520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b530: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b540: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
b550: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b560: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20  E_IOERR_NOMEM"; 
b570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b580: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b590: 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20  OERR_ACCESS:    
b5a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b5b0: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
b5c0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b5d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b5e0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b5f0: 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VEDLOCK:.       
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b620: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
b630: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
b640: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b650: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b660: 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20  R_LOCK:         
b670: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b680: 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20  IOERR_LOCK";    
b690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b6a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b6b0: 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20  RR_CLOSE:       
b6c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b6d0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20  _IOERR_CLOSE";  
b6e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b6f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b700: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20  ERR_DIR_CLOSE:  
b710: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b720: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
b730: 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  E";   break;.   
b740: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b750: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20  OERR_SHMOPEN:   
b760: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b770: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
b780: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b790: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b7a0: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20  IOERR_SHMSIZE:  
b7b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b7c0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b7d0: 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
b7e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b7f0: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20  _IOERR_SHMLOCK: 
b800: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b810: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
b820: 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  CK";     break;.
b830: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b840: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20  E_IOERR_SHMMAP: 
b850: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b860: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
b870: 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AP";      break;
b880: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b890: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20  TE_IOERR_SEEK:  
b8a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b8b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
b8c0: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
b8d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b8e0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b8f0: 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20  _NOENT: zName = 
b900: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
b910: 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61  LETE_NOENT";brea
b920: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b930: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a  LITE_IOERR_MMAP:
b940: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b950: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d   "SQLITE_IOERR_M
b960: 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72 65  MAP";        bre
b970: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b980: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
b990: 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  EMPPATH:  zName 
b9a0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b9b0: 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72  GETTEMPPATH"; br
b9c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b9d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
b9e0: 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65  VPATH:     zName
b9f0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ba00: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62  _CONVPATH";    b
ba10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ba20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a   SQLITE_CORRUPT:
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
ba40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
ba50: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  UPT";           
ba60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ba70: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
ba80: 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61  _VTAB:       zNa
ba90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
baa0: 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20  RUPT_VTAB";     
bab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bac0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
bad0: 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  ND:           zN
bae0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
baf0: 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20  TFOUND";        
bb00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bb10: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bb30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
bb40: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20  ULL";           
bb50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bb60: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
bb70: 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20  OPEN:           
bb80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bb90: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20  CANTOPEN";      
bba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bbb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
bbc0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a  TOPEN_NOTEMPDIR:
bbd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bbe0: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
bbf0: 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  DIR";break;.    
bc00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
bc10: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20  NTOPEN_ISDIR:   
bc20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bc30: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
bc40: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
bc50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bc60: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
bc70: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
bc80: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
bc90: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
bca0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bcb0: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
bcc0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
bcd0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
bce0: 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  VPATH"; break;. 
bcf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bd00: 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20  _PROTOCOL:      
bd10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bd20: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20  LITE_PROTOCOL"; 
bd30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bd40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bd50: 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20  E_EMPTY:        
bd60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bd70: 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20  QLITE_EMPTY";   
bd80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bd90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bda0: 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20  TE_SCHEMA:      
bdb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bdc0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20  SQLITE_SCHEMA"; 
bdd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bde0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bdf0: 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20  ITE_TOOBIG:     
be00: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
be10: 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b  "SQLITE_TOOBIG";
be20: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
be30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
be40: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a  LITE_CONSTRAINT:
be50: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
be60: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
be70: 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72 65  INT";        bre
be80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
be90: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bea0: 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20  _UNIQUE:  zName 
beb0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bec0: 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72  AINT_UNIQUE"; br
bed0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bee0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bef0: 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65  T_TRIGGER: zName
bf00: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bf10: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62  RAINT_TRIGGER";b
bf20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bf30: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
bf40: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20  NT_FOREIGNKEY:. 
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bf70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bf80: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
bf90: 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  NKEY";   break;.
bfa0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bfb0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
bfc0: 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CK:   zName = "S
bfd0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bfe0: 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b  _CHECK";  break;
bff0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c000: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
c010: 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20  IMARYKEY:.      
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c040: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c050: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22  AINT_PRIMARYKEY"
c060: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
c070: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c080: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a  STRAINT_NOTNULL:
c090: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c0a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
c0b0: 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ULL";break;.    
c0c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c0d0: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
c0e0: 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OOK:.           
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c110: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c120: 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62  COMMITHOOK";   b
c130: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c140: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c150: 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d  NT_VTAB:    zNam
c160: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
c170: 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20  TRAINT_VTAB";   
c180: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c190: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c1a0: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  INT_FUNCTION:.  
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c1d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c1e0: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
c1f0: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
c200: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c210: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
c220: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
c230: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c240: 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ROWID";  break;.
c250: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c260: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20  E_MISMATCH:     
c270: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c280: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b  QLITE_MISMATCH";
c290: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c2a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c2b0: 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20  TE_MISUSE:      
c2c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c2d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
c2e0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c2f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c300: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
c310: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c320: 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20  "SQLITE_NOLFS"; 
c330: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c340: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c350: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
c360: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c370: 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20   "SQLITE_AUTH"; 
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
c390: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c3a0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
c3b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c3c0: 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  = "SQLITE_FORMAT
c3d0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
c3e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c3f0: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20  SQLITE_RANGE:   
c400: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c410: 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45   = "SQLITE_RANGE
c420: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
c430: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c440: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20   SQLITE_NOTADB: 
c450: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c460: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41  e = "SQLITE_NOTA
c470: 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  DB";            
c480: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c490: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20  e SQLITE_ROW:   
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c4b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57  me = "SQLITE_ROW
c4c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
c4d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c4e0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
c4f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
c500: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c510: 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20 20  TICE";          
c520: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c530: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
c540: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a  E_RECOVER_WAL: z
c550: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c560: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
c570: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
c580: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
c590: 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
c5a0: 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ACK:.           
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c5d0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c5e0: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  VER_ROLLBACK"; b
c5f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c600: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a   SQLITE_WARNING:
c610: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c620: 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e  e = "SQLITE_WARN
c630: 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  ING";           
c640: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c650: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
c660: 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61  _AUTOINDEX:  zNa
c670: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
c680: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b  NING_AUTOINDEX";
c690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c6a0: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20  se SQLITE_DONE: 
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c6c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f  ame = "SQLITE_DO
c6d0: 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  NE";            
c6e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c6f0: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
c700: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
c710: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
c720: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c730: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
c740: 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f  , zBuf, "SQLITE_
c750: 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72  UNKNOWN(%d)", or
c760: 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  igRc);.    zName
c770: 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72   = zBuf;.  }.  r
c780: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
c790: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
c7a0: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
c7b0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
c7c0: 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
c7d0: 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
c7e0: 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
c7f0: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
c800: 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28   *sqlite3ErrStr(
c810: 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69  int rc){.  stati
c820: 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f  c const char* co
c830: 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20  nst aMsg[] = {. 
c840: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20     /* SQLITE_OK 
c850: 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74           */ "not
c860: 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20   an error",.    
c870: 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  /* SQLITE_ERROR 
c880: 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f        */ "SQL lo
c890: 67 69 63 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  gic error",.    
c8a0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
c8b0: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
c8c0: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
c8d0: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
c8e0: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
c8f0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c900: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
c910: 2f 20 22 71 75 65 72 79 20 61 62 6f 72 74 65 64  / "query aborted
c920: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c930: 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20  _BUSY        */ 
c940: 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  "database is loc
c950: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
c960: 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  ITE_LOCKED      
c970: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62  */ "database tab
c980: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  le is locked",. 
c990: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d     /* SQLITE_NOM
c9a0: 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74  EM       */ "out
c9b0: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20   of memory",.   
c9c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f   /* SQLITE_READO
c9d0: 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d  NLY    */ "attem
c9e0: 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65  pt to write a re
c9f0: 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22  adonly database"
ca00: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
ca10: 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22  INTERRUPT   */ "
ca20: 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20  interrupted",.  
ca30: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52    /* SQLITE_IOER
ca40: 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b  R       */ "disk
ca50: 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20   I/O error",.   
ca60: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   /* SQLITE_CORRU
ca70: 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  PT     */ "datab
ca80: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
ca90: 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20  s malformed",.  
caa0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46    /* SQLITE_NOTF
cab0: 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e  OUND    */ "unkn
cac0: 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a  own operation",.
cad0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55      /* SQLITE_FU
cae0: 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  LL        */ "da
caf0: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
cb00: 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20  s full",.    /* 
cb10: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
cb20: 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f     */ "unable to
cb30: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
cb40: 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ile",.    /* SQL
cb50: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20  ITE_PROTOCOL    
cb60: 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  */ "locking prot
cb70: 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ocol",.    /* SQ
cb80: 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20  LITE_EMPTY      
cb90: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
cba0: 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20  LITE_SCHEMA     
cbb0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63   */ "database sc
cbc0: 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64  hema has changed
cbd0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cbe0: 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20  _TOOBIG      */ 
cbf0: 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20  "string or blob 
cc00: 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a  too big",.    /*
cc10: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
cc20: 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69  NT  */ "constrai
cc30: 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20  nt failed",.    
cc40: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  /* SQLITE_MISMAT
cc50: 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79  CH    */ "dataty
cc60: 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20  pe mismatch",.  
cc70: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55    /* SQLITE_MISU
cc80: 53 45 20 20 20 20 20 20 2a 2f 20 22 62 61 64 20  SE      */ "bad 
cc90: 70 61 72 61 6d 65 74 65 72 20 6f 72 20 6f 74 68  parameter or oth
cca0: 65 72 20 41 50 49 20 6d 69 73 75 73 65 22 2c 0a  er API misuse",.
ccb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
ccc0: 53 41 42 4c 45 5f 4c 46 53 0a 20 20 20 20 2f 2a  SABLE_LFS.    /*
ccd0: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20   SQLITE_NOLFS   
cce0: 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69      */ "large fi
ccf0: 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69  le support is di
cd00: 73 61 62 6c 65 64 22 2c 0a 23 65 6c 73 65 0a 20  sabled",.#else. 
cd10: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c     /* SQLITE_NOL
cd20: 46 53 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 23  FS       */ 0,.#
cd30: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 53 51 4c  endif.    /* SQL
cd40: 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20  ITE_AUTH        
cd50: 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  */ "authorizatio
cd60: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
cd70: 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20  * SQLITE_FORMAT 
cd80: 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f       */ 0,.    /
cd90: 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20  * SQLITE_RANGE  
cda0: 20 20 20 20 20 2a 2f 20 22 63 6f 6c 75 6d 6e 20       */ "column 
cdb0: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
cdc0: 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ge",.    /* SQLI
cdd0: 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a  TE_NOTADB      *
cde0: 2f 20 22 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  / "file is not a
cdf0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
ce00: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  /* SQLITE_NOTICE
ce10: 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 69 66 69        */ "notifi
ce20: 63 61 74 69 6f 6e 20 6d 65 73 73 61 67 65 22 2c  cation message",
ce30: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 57  .    /* SQLITE_W
ce40: 41 52 4e 49 4e 47 20 20 20 20 20 2a 2f 20 22 77  ARNING     */ "w
ce50: 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 65 22 2c  arning message",
ce60: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
ce70: 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e  ar *zErr = "unkn
ce80: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77  own error";.  sw
ce90: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
cea0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
ceb0: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20  T_ROLLBACK: {.  
cec0: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72      zErr = "abor
ced0: 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43  t due to ROLLBAC
cee0: 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  K";.      break;
cef0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
cf00: 53 51 4c 49 54 45 5f 52 4f 57 3a 20 7b 0a 20 20  SQLITE_ROW: {.  
cf10: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 6e 6f 74      zErr = "anot
cf20: 68 65 72 20 72 6f 77 20 61 76 61 69 6c 61 62 6c  her row availabl
cf30: 65 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e";.      break;
cf40: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
cf50: 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 7b 0a 20  SQLITE_DONE: {. 
cf60: 20 20 20 20 20 7a 45 72 72 20 3d 20 22 6e 6f 20       zErr = "no 
cf70: 6d 6f 72 65 20 72 6f 77 73 20 61 76 61 69 6c 61  more rows availa
cf80: 62 6c 65 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ble";.      brea
cf90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
cfa0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
cfb0: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
cfc0: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
cfd0: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
cfe0: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
cff0: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
d000: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
d010: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
d020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d030: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
d040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d050: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
d060: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
d070: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
d080: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
d090: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
d0a0: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
d0b0: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
d0c0: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
d0d0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
d0e0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
d0f0: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
d100: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
d110: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
d120: 6f 6e 2d 7a 65 72 6f 20 74 6f 20 72 65 74 72 79  on-zero to retry
d130: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 52 65 74 75   the lock.  Retu
d140: 72 6e 20 7a 65 72 6f 20 74 6f 20 73 74 6f 70 20  rn zero to stop 
d150: 74 72 79 69 6e 67 0a 2a 2a 20 61 6e 64 20 63 61  trying.** and ca
d160: 75 73 65 20 53 51 4c 69 74 65 20 74 6f 20 72 65  use SQLite to re
d170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
d180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d190: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
d1a0: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  yCallback(.  voi
d1b0: 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20  d *ptr,         
d1c0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
d1d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
d1e0: 20 20 69 6e 74 20 63 6f 75 6e 74 2c 20 20 20 20    int count,    
d1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d200: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61  mber of times ta
d210: 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73  ble has been bus
d220: 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  y */.  sqlite3_f
d230: 69 6c 65 20 2a 70 46 69 6c 65 20 20 20 20 20 20  ile *pFile      
d240: 2f 2a 20 54 68 65 20 66 69 6c 65 20 6f 6e 20 77  /* The file on w
d250: 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20 6f 63  hich the lock oc
d260: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  curred */.){.#if
d270: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
d280: 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20  | HAVE_USLEEP.  
d290: 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20  /* This case is 
d2a0: 66 6f 72 20 73 79 73 74 65 6d 73 20 74 68 61 74  for systems that
d2b0: 20 68 61 76 65 20 73 75 70 70 6f 72 74 20 66 6f   have support fo
d2c0: 72 20 73 6c 65 65 70 69 6e 67 20 66 6f 72 20 66  r sleeping for f
d2d0: 72 61 63 74 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a  ractions of.  **
d2e0: 20 61 20 73 65 63 6f 6e 64 2e 20 20 45 78 61 6d   a second.  Exam
d2f0: 70 6c 65 73 3a 20 20 41 6c 6c 20 77 69 6e 64 6f  ples:  All windo
d300: 77 73 20 73 79 73 74 65 6d 73 2c 20 75 6e 69 78  ws systems, unix
d310: 20 73 79 73 74 65 6d 73 20 77 69 74 68 20 75 73   systems with us
d320: 6c 65 65 70 28 29 20 2a 2f 0a 20 20 73 74 61 74  leep() */.  stat
d330: 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61  ic const u8 dela
d340: 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c  ys[] =.     { 1,
d350: 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32   2, 5, 10, 15, 2
d360: 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20  0, 25, 25,  25, 
d370: 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b   50,  50, 100 };
d380: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
d390: 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20  u8 totals[] =.  
d3a0: 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38     { 0, 1, 3,  8
d3b0: 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38  , 18, 33, 53, 78
d3c0: 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c  , 103, 128, 178,
d3d0: 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65   228 };.# define
d3e0: 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a   NDELAY ArraySiz
d3f0: 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69  e(delays).  sqli
d400: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
d410: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
d420: 74 6d 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  tmout = db->busy
d430: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
d440: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 23 69  elay, prior;..#i
d450: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d460: 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54  LE_SETLK_TIMEOUT
d470: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
d480: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c  FileControl(pFil
d490: 65 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e,SQLITE_FCNTL_L
d4a0: 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 26 74 6d 6f  OCK_TIMEOUT,&tmo
d4b0: 75 74 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ut)==SQLITE_OK )
d4c0: 7b 0a 20 20 20 20 69 66 28 20 63 6f 75 6e 74 20  {.    if( count 
d4d0: 29 7b 0a 20 20 20 20 20 20 74 6d 6f 75 74 20 3d  ){.      tmout =
d4e0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
d4f0: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
d500: 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  File, SQLITE_FCN
d510: 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c  TL_LOCK_TIMEOUT,
d520: 20 26 74 6d 6f 75 74 29 3b 0a 20 20 20 20 20 20   &tmout);.      
d530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
d540: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
d550: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  n 1;.    }.  }.#
d560: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
d570: 52 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a  RAMETER(pFile);.
d580: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
d590: 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69   count>=0 );.  i
d5a0: 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41  f( count < NDELA
d5b0: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
d5c0: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a   delays[count];.
d5d0: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
d5e0: 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c  ls[count];.  }el
d5f0: 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20  se{.    delay = 
d600: 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d  delays[NDELAY-1]
d610: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
d620: 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b  tals[NDELAY-1] +
d630: 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e   delay*(count-(N
d640: 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20  DELAY-1));.  }. 
d650: 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c   if( prior + del
d660: 61 79 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20 20  ay > tmout ){.  
d670: 20 20 64 65 6c 61 79 20 3d 20 74 6d 6f 75 74 20    delay = tmout 
d680: 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28  - prior;.    if(
d690: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
d6a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
d6b0: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
d6c0: 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29  Vfs, delay*1000)
d6d0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
d6e0: 6c 73 65 0a 20 20 2f 2a 20 54 68 69 73 20 63 61  lse.  /* This ca
d6f0: 73 65 20 66 6f 72 20 75 6e 69 78 20 73 79 73 74  se for unix syst
d700: 65 6d 73 20 74 68 61 74 20 6c 61 63 6b 20 75 73  ems that lack us
d710: 6c 65 65 70 28 29 20 73 75 70 70 6f 72 74 2e 20  leep() support. 
d720: 20 53 6c 65 65 70 69 6e 67 0a 20 20 2a 2a 20 6d   Sleeping.  ** m
d730: 75 73 74 20 62 65 20 64 6f 6e 65 20 69 6e 20 69  ust be done in i
d740: 6e 63 72 65 6d 65 6e 74 73 20 6f 66 20 77 68 6f  ncrements of who
d750: 6c 65 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20  le seconds */.  
d760: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
d770: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
d780: 69 6e 74 20 74 6d 6f 75 74 20 3d 20 28 28 73 71  int tmout = ((sq
d790: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
d7a0: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 55 4e 55  syTimeout;.  UNU
d7b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 46  SED_PARAMETER(pF
d7c0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 28 63 6f 75  ile);.  if( (cou
d7d0: 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 6d 6f  nt+1)*1000 > tmo
d7e0: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
d7f0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
d800: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
d810: 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72  s, 1000000);.  r
d820: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
d830: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
d840: 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68  the given busy h
d850: 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  andler..**.** Th
d860: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d870: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65  lled when an ope
d880: 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 74 6f  ration failed to
d890: 20 61 63 71 75 69 72 65 20 61 0a 2a 2a 20 6c 6f   acquire a.** lo
d8a0: 63 6b 20 6f 6e 20 56 46 53 20 66 69 6c 65 20 70  ck on VFS file p
d8b0: 46 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  File..**.** If t
d8c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
d8d0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
d8e0: 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65  e lock is retrie
d8f0: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74  d.  If it.** ret
d900: 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72  urns 0, the oper
d910: 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74  ation aborts wit
d920: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
d930: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
d940: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
d950: 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64  Handler(BusyHand
d960: 6c 65 72 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ler *p, sqlite3_
d970: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
d980: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 2d  int rc;.  if( p-
d990: 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3d 3d 30  >xBusyHandler==0
d9a0: 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29   || p->nBusy<0 )
d9b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
d9c0: 20 70 2d 3e 62 45 78 74 72 61 46 69 6c 65 41 72   p->bExtraFileAr
d9d0: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 64 20  g ){.    /* Add 
d9e0: 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  an extra paramet
d9f0: 65 72 20 77 69 74 68 20 74 68 65 20 70 46 69 6c  er with the pFil
da00: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
da10: 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
da20: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75  ** callback argu
da30: 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20  ment list */.   
da40: 20 69 6e 74 20 28 2a 78 54 72 61 29 28 76 6f 69   int (*xTra)(voi
da50: 64 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 66  d*,int,sqlite3_f
da60: 69 6c 65 2a 29 3b 0a 20 20 20 20 78 54 72 61 20  ile*);.    xTra 
da70: 3d 20 28 69 6e 74 28 2a 29 28 76 6f 69 64 2a 2c  = (int(*)(void*,
da80: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65  int,sqlite3_file
da90: 2a 29 29 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c  *))p->xBusyHandl
daa0: 65 72 3b 0a 20 20 20 20 72 63 20 3d 20 78 54 72  er;.    rc = xTr
dab0: 61 28 70 2d 3e 70 42 75 73 79 41 72 67 2c 20 70  a(p->pBusyArg, p
dac0: 2d 3e 6e 42 75 73 79 2c 20 70 46 69 6c 65 29 3b  ->nBusy, pFile);
dad0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
dae0: 20 4c 65 67 61 63 79 20 73 74 79 6c 65 20 62 75   Legacy style bu
daf0: 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy handler callb
db00: 61 63 6b 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ack */.    rc = 
db10: 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  p->xBusyHandler(
db20: 70 2d 3e 70 42 75 73 79 41 72 67 2c 20 70 2d 3e  p->pBusyArg, p->
db30: 6e 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66  nBusy);.  }.  if
db40: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
db50: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
db60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
db70: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
db80: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
db90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
dba0: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
dbb0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
dbc0: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
dbd0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
dbe0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
dbf0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
dc00: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
dc10: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
dc20: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
dc30: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
dc40: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
dc50: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
dc60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
dc70: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
dc80: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
dc90: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
dca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
dcb0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
dcc0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
dcd0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
dce0: 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  x);.  db->busyHa
dcf0: 6e 64 6c 65 72 2e 78 42 75 73 79 48 61 6e 64 6c  ndler.xBusyHandl
dd00: 65 72 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62  er = xBusy;.  db
dd10: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 42  ->busyHandler.pB
dd20: 75 73 79 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  usyArg = pArg;. 
dd30: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
dd40: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62  .nBusy = 0;.  db
dd50: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 62 45  ->busyHandler.bE
dd60: 78 74 72 61 46 69 6c 65 41 72 67 20 3d 20 30 3b  xtraFileArg = 0;
dd70: 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f  .  db->busyTimeo
dd80: 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ut = 0;.  sqlite
dd90: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
dda0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
ddb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ddc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ddd0: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
dde0: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
ddf0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
de00: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
de10: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
de20: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
de30: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
de40: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
de50: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
de60: 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72  ument. The progr
de70: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c  ess callback wil
de80: 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  l.** be invoked 
de90: 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64  every nOps opcod
dea0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
deb0: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
dec0: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
ded0: 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73  *db, .  int nOps
dee0: 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72  ,.  int (*xProgr
def0: 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20  ess)(void*), .  
df00: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69  void *pArg.){.#i
df10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
df20: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
df30: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
df40: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
df50: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
df60: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
df70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
df80: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
df90: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
dfa0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70  utex);.  if( nOp
dfb0: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  s>0 ){.    db->x
dfc0: 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67  Progress = xProg
dfd0: 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50  ress;.    db->nP
dfe0: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e  rogressOps = (un
dff0: 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20  signed)nOps;.   
e000: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
e010: 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73  g = pArg;.  }els
e020: 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  e{.    db->xProg
e030: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  ress = 0;.    db
e040: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
e050: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f   0;.    db->pPro
e060: 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20  gressArg = 0;.  
e070: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
e080: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
e090: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  x);.}.#endif.../
e0a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e0b0: 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66  e installs a def
e0c0: 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65  ault busy handle
e0d0: 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72  r that waits for
e0e0: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
e0f0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  d number of mill
e100: 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20  iseconds before 
e110: 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a  returning 0..*/.
e120: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
e130: 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33  _timeout(sqlite3
e140: 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23   *db, int ms){.#
e150: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e160: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e170: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
e180: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
e190: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e1a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
e1b0: 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  f.  if( ms>0 ){.
e1c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
e1d0: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 28 69 6e  _handler(db, (in
e1e0: 74 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  t(*)(void*,int))
e1f0: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
e200: 79 43 61 6c 6c 62 61 63 6b 2c 0a 20 20 20 20 20  yCallback,.     
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 64          (void*)d
e230: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79  b);.    db->busy
e240: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
e250: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
e260: 72 2e 62 45 78 74 72 61 46 69 6c 65 41 72 67 20  r.bExtraFileArg 
e270: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
e280: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
e290: 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29  andler(db, 0, 0)
e2a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e2b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e2c0: 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e  ** Cause any pen
e2d0: 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74  ding operation t
e2e0: 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61  o stop at its ea
e2f0: 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69  rliest opportuni
e300: 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
e310: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71  te3_interrupt(sq
e320: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
e330: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e340: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e350: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
e360: 68 65 63 6b 4f 6b 28 64 62 29 20 26 26 20 28 64  heckOk(db) && (d
e370: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 67 69  b==0 || db->magi
e380: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
e390: 5a 4f 4d 42 49 45 29 20 29 7b 0a 20 20 20 20 28  ZOMBIE) ){.    (
e3a0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e3b0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e3c0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
e3d0: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
e3e0: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
e3f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e400: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
e410: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
e420: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
e430: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
e440: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
e450: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
e460: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
e470: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
e480: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
e490: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
e4a0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
e4b0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
e4c0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
e4d0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
e4e0: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
e4f0: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
e500: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
e510: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
e520: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
e530: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
e540: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
e550: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
e560: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
e570: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
e580: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e590: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e5a0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e5b0: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
e5c0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e5d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e5e0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
e5f0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e600: 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 56  t*),.  void (*xV
e610: 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f  alue)(sqlite3_co
e620: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
e630: 28 2a 78 49 6e 76 65 72 73 65 29 28 73 71 6c 69  (*xInverse)(sqli
e640: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e650: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e660: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
e670: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
e680: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
e690: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
e6a0: 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73    int extraFlags
e6b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
e6c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e6d0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
e6e0: 61 73 73 65 72 74 28 20 78 56 61 6c 75 65 3d 3d  assert( xValue==
e6f0: 30 20 7c 7c 20 78 53 46 75 6e 63 3d 3d 30 20 29  0 || xSFunc==0 )
e700: 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f  ;.  if( zFunctio
e710: 6e 4e 61 6d 65 3d 3d 30 20 20 20 20 20 20 20 20  nName==0        
e720: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
e730: 68 61 76 65 20 61 20 76 61 6c 69 64 20 6e 61 6d  have a valid nam
e740: 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 78 53 46 75  e */.   || (xSFu
e750: 6e 63 21 3d 30 20 26 26 20 78 46 69 6e 61 6c 21  nc!=0 && xFinal!
e760: 3d 30 29 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  =0)        /* No
e770: 74 20 62 6f 74 68 20 78 53 46 75 6e 63 20 61 6e  t both xSFunc an
e780: 64 20 78 46 69 6e 61 6c 20 2a 2f 0a 20 20 20 7c  d xFinal */.   |
e790: 7c 20 28 28 78 46 69 6e 61 6c 3d 3d 30 29 21 3d  | ((xFinal==0)!=
e7a0: 28 78 53 74 65 70 3d 3d 30 29 29 20 20 20 20 20  (xStep==0))     
e7b0: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
e7c0: 74 68 65 72 20 6f 66 20 78 46 69 6e 61 6c 20 61  ther of xFinal a
e7d0: 6e 64 20 78 53 74 65 70 20 2a 2f 0a 20 20 20 7c  nd xStep */.   |
e7e0: 7c 20 28 28 78 56 61 6c 75 65 3d 3d 30 29 21 3d  | ((xValue==0)!=
e7f0: 28 78 49 6e 76 65 72 73 65 3d 3d 30 29 29 20 20  (xInverse==0))  
e800: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
e810: 74 68 65 72 20 6f 66 20 78 56 61 6c 75 65 2c 20  ther of xValue, 
e820: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20 20 20 7c  xInverse */.   |
e830: 7c 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41  | (nArg<-1 || nA
e840: 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  rg>SQLITE_MAX_FU
e850: 4e 43 54 49 4f 4e 5f 41 52 47 29 0a 20 20 20 7c  NCTION_ARG).   |
e860: 7c 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20  | (255<(nName = 
e870: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e880: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
e890: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
e8a0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
e8b0: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  BKPT;.  }..  ass
e8c0: 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
e8d0: 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54  _CONSTANT==SQLIT
e8e0: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
e8f0: 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20  );.  extraFlags 
e900: 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f  = enc &  SQLITE_
e910: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20  DETERMINISTIC;. 
e920: 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f   enc &= (SQLITE_
e930: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c  FUNC_ENCMASK|SQL
e940: 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66  ITE_ANY);.  .#if
e950: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e960: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
e970: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
e980: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
e990: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
e9a0: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
e9b0: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
e9c0: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
e9d0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
e9e0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
e9f0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
ea00: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
ea10: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
ea20: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
ea30: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
ea40: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
ea50: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
ea60: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
ea70: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
ea80: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
ea90: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
eaa0: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
eab0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
eac0: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
ead0: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
eae0: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
eaf0: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
eb00: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
eb10: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
eb20: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
eb30: 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73  _UTF8|extraFlags
eb40: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
eb50: 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53  Data, xSFunc, xS
eb60: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61  tep, xFinal, xVa
eb70: 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70  lue, xInverse, p
eb80: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
eb90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
eba0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
ebb0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
ebc0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
ebd0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
ebe0: 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61  TE_UTF16LE|extra
ebf0: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
ec00: 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75   pUserData, xSFu
ec10: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
ec20: 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65  l, xValue, xInve
ec30: 72 73 65 2c 20 70 44 65 73 74 72 75 63 74 6f 72  rse, pDestructor
ec40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ec50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ec60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
ec70: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63  c;.    }.    enc
ec80: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   = SQLITE_UTF16B
ec90: 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65  E;.  }.#else.  e
eca0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
ecb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a  ;.#endif.  .  /*
ecc0: 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69   Check if an exi
ecd0: 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69  sting function i
ece0: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
ecf0: 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  en or deleted. I
ed00: 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74  f so,.  ** and t
ed10: 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
ed20: 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  VMs, then return
ed30: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66   SQLITE_BUSY. If
ed40: 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a   a function.  **
ed50: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
ed60: 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74  dden/deleted but
ed70: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63   there are no ac
ed80: 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20  tive VMs, allow 
ed90: 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  the.  ** operati
eda0: 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62  on to continue b
edb0: 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  ut invalidate al
edc0: 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74  l precompiled st
edd0: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
ede0: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
edf0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
ee00: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
ee10: 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20  , (u8)enc, 0);. 
ee20: 20 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75   if( p && (p->fu
ee30: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
ee40: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d  _FUNC_ENCMASK)==
ee50: 28 75 33 32 29 65 6e 63 20 26 26 20 70 2d 3e 6e  (u32)enc && p->n
ee60: 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20  Arg==nArg ){.   
ee70: 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
ee80: 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
ee90: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
eea0: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
eeb0: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
eec0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
eed0: 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69  dify user-functi
eee0: 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  on due to active
eef0: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
ef00: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
ef10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ef20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
ef30: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
ef40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
ef50: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
ef60: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c  edStatements(db,
ef70: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
ef80: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
ef90: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
efa0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
efb0: 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a  g, (u8)enc, 1);.
efc0: 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62    assert(p || db
efd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b  ->mallocFailed);
efe0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
eff0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f000: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
f010: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
f020: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
f030: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
f040: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
f050: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
f060: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
f070: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
f080: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
f090: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
f0a0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
f0b0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
f0c0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
f0d0: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
f0e0: 7d 0a 20 20 70 2d 3e 75 2e 70 44 65 73 74 72 75  }.  p->u.pDestru
f0f0: 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74  ctor = pDestruct
f100: 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61  or;.  p->funcFla
f110: 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61  gs = (p->funcFla
f120: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
f130: 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72  _ENCMASK) | extr
f140: 61 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61  aFlags;.  testca
f150: 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  se( p->funcFlags
f160: 20 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   & SQLITE_DETERM
f170: 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e  INISTIC );.  p->
f180: 78 53 46 75 6e 63 20 3d 20 78 53 46 75 6e 63 20  xSFunc = xSFunc 
f190: 3f 20 78 53 46 75 6e 63 20 3a 20 78 53 74 65 70  ? xSFunc : xStep
f1a0: 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65  ;.  p->xFinalize
f1b0: 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e   = xFinal;.  p->
f1c0: 78 56 61 6c 75 65 20 3d 20 78 56 61 6c 75 65 3b  xValue = xValue;
f1d0: 0a 20 20 70 2d 3e 78 49 6e 76 65 72 73 65 20 3d  .  p->xInverse =
f1e0: 20 78 49 6e 76 65 72 73 65 3b 0a 20 20 70 2d 3e   xInverse;.  p->
f1f0: 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65  pUserData = pUse
f200: 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67  rData;.  p->nArg
f210: 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20   = (u16)nArg;.  
f220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 65  ;.}../*.** Worke
f240: 72 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20  r function used 
f250: 62 79 20 75 74 66 2d 38 20 41 50 49 73 20 74 68  by utf-8 APIs th
f260: 61 74 20 63 72 65 61 74 65 20 6e 65 77 20 66 75  at create new fu
f270: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  nctions:.**.**  
f280: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
f290: 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 20 20  _function().**  
f2a0: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
f2b0: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 29 0a 2a  _function_v2().*
f2c0: 2a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  *    sqlite3_cre
f2d0: 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74  ate_window_funct
f2e0: 69 6f 6e 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ion().*/.static 
f2f0: 69 6e 74 20 63 72 65 61 74 65 46 75 6e 63 74 69  int createFuncti
f300: 6f 6e 41 70 69 28 0a 20 20 73 71 6c 69 74 65 33  onApi(.  sqlite3
f310: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
f320: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
f330: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
f340: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
f350: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
f360: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f370: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f380: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
f390: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
f3a0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
f3b0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
f3c0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
f3d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
f3e0: 20 20 76 6f 69 64 20 28 2a 78 56 61 6c 75 65 29    void (*xValue)
f3f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f400: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e  *),.  void (*xIn
f410: 76 65 72 73 65 29 28 73 71 6c 69 74 65 33 5f 63  verse)(sqlite3_c
f420: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
f430: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
f440: 76 6f 69 64 28 2a 78 44 65 73 74 72 6f 79 29 28  void(*xDestroy)(
f450: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
f460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
f470: 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  R;.  FuncDestruc
f480: 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a  tor *pArg = 0;..
f490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f4a0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
f4b0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
f4c0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
f4d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
f4e0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
f4f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
f500: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f510: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f520: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
f530: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
f540: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
f550: 69 74 65 33 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  ite3Malloc(sizeo
f560: 66 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72  f(FuncDestructor
f570: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72  ));.    if( !pAr
f580: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
f590: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
f5a0: 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70        xDestroy(p
f5b0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75  );.      goto ou
f5c0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  t;.    }.    pAr
f5d0: 67 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 20  g->nRef = 0;.   
f5e0: 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20   pArg->xDestroy 
f5f0: 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20  = xDestroy;.    
f600: 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20  pArg->pUserData 
f610: 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = p;.  }.  rc = 
f620: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
f630: 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  c(db, zFunc, nAr
f640: 67 2c 20 65 6e 63 2c 20 70 2c 20 0a 20 20 20 20  g, enc, p, .    
f650: 20 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c    xSFunc, xStep,
f660: 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c   xFinal, xValue,
f670: 20 78 49 6e 76 65 72 73 65 2c 20 70 41 72 67 0a   xInverse, pArg.
f680: 20 20 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20    );.  if( pArg 
f690: 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30  && pArg->nRef==0
f6a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f6b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
f6c0: 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29  .    xDestroy(p)
f6d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
f6e0: 65 65 28 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20  ee(pArg);.  }.. 
f6f0: 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  out:.  rc = sqli
f700: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
f710: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
f720: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f730: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
f740: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
f750: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
f760: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
f770: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
f780: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
f790: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
f7a0: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
f7b0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
f7c0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
f7d0: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
f7e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f7f0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f800: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
f810: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
f820: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
f830: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
f840: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
f850: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
f860: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72 65  .){.  return cre
f870: 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 64  ateFunctionApi(d
f880: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
f890: 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20  enc, p, xSFunc, 
f8a0: 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20  xStep,.         
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8c0: 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61             xFina
f8d0: 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  l, 0, 0, 0);.}.i
f8e0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
f8f0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
f900: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
f910: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
f920: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
f930: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
f940: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
f950: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
f960: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
f970: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
f980: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
f990: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f9a0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f9b0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
f9c0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
f9d0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
f9e0: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
f9f0: 64 20 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  d *).){.  return
fa00: 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41   createFunctionA
fa10: 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  pi(db, zFunc, nA
fa20: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46 75  rg, enc, p, xSFu
fa30: 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20  nc, xStep,.     
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78                 x
fa60: 46 69 6e 61 6c 2c 20 30 2c 20 30 2c 20 78 44 65  Final, 0, 0, xDe
fa70: 73 74 72 6f 79 29 3b 0a 7d 0a 69 6e 74 20 73 71  stroy);.}.int sq
fa80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e  lite3_create_win
fa90: 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  dow_function(.  
faa0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
fab0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
fac0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
fad0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
fae0: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *p,.  void (*xSt
faf0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
fb00: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
fb10: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
fb20: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
fb30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
fb40: 20 20 76 6f 69 64 20 28 2a 78 56 61 6c 75 65 29    void (*xValue)
fb50: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
fb60: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e  *),.  void (*xIn
fb70: 76 65 72 73 65 29 28 73 71 6c 69 74 65 33 5f 63  verse)(sqlite3_c
fb80: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
fb90: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
fba0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79   void (*xDestroy
fbb0: 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 72  )(void *).){.  r
fbc0: 65 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63  eturn createFunc
fbd0: 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e  tionApi(db, zFun
fbe0: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
fbf0: 20 30 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20   0, xStep,.     
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78                 x
fc20: 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78  Final, xValue, x
fc30: 49 6e 76 65 72 73 65 2c 20 78 44 65 73 74 72 6f  Inverse, xDestro
fc40: 79 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  y);.}..#ifndef S
fc50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
fc60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
fc70: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a  ate_function16(.
fc80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
fc90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75   const void *zFu
fca0: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
fcb0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54  t nArg,.  int eT
fcc0: 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a  extRep,.  void *
fcd0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
fce0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
fcf0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
fd00: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
fd10: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
fd20: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
fd30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
fd40: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
fd50: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
fd60: 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  xt*).){.  int rc
fd70: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38  ;.  char *zFunc8
fd80: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
fd90: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
fda0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
fdb0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
fdc0: 29 20 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  ) || zFunctionNa
fdd0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  me==0 ) return S
fde0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
fdf0: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
fe00: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fe10: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
fe20: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
fe30: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75  cFailed );.  zFu
fe40: 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  nc8 = sqlite3Utf
fe50: 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74  16to8(db, zFunct
fe60: 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  ionName, -1, SQL
fe70: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
fe80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
fe90: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
fea0: 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65  Func8, nArg, eTe
feb0: 78 74 52 65 70 2c 20 70 2c 20 78 53 46 75 6e 63  xtRep, p, xSFunc
fec0: 2c 78 53 74 65 70 2c 78 46 69 6e 61 6c 2c 30 2c  ,xStep,xFinal,0,
fed0: 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  0,0);.  sqlite3D
fee0: 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38  bFree(db, zFunc8
fef0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ff00: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
ff10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ff20: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ff30: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
ff40: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
ff50: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
ff60: 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
ff70: 61 74 69 6f 6e 20 6f 66 20 61 6e 20 53 51 4c 20  ation of an SQL 
ff80: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 6c  function that al
ff90: 77 61 79 73 0a 2a 2a 20 66 61 69 6c 73 20 77 69  ways.** fails wi
ffa0: 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
ffb0: 61 67 65 20 73 74 61 74 69 6e 67 20 74 68 61 74  age stating that
ffc0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
ffd0: 20 75 73 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20   used in the.** 
ffe0: 77 72 6f 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20  wrong context.  
fff0: 54 68 65 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  The sqlite3_over
10000 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 29 20  load_function() 
10010 41 50 49 20 6d 69 67 68 74 20 63 6f 6e 73 74 72  API might constr
10020 75 63 74 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  uct.** SQL funct
10030 69 6f 6e 20 74 68 61 74 20 75 73 65 20 74 68 69  ion that use thi
10040 73 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  s routine so tha
10050 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20  t the functions 
10060 77 69 6c 6c 20 65 78 69 73 74 0a 2a 2a 20 66 6f  will exist.** fo
10070 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
10080 6e 20 62 75 74 20 61 72 65 20 61 63 74 75 61 6c  n but are actual
10090 6c 79 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  ly overloaded by
100a0 20 74 68 65 20 78 46 69 6e 64 46 75 6e 63 74 69   the xFindFuncti
100b0 6f 6e 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  on.** method of 
100c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
100d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
100e0 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e  qlite3InvalidFun
100f0 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
10100 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
10110 74 2c 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74  t,  /* The funct
10120 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 63 6f 6e 74  ion calling cont
10130 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 6f 74  ext */.  int Not
10140 55 73 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  Used,           
10150 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10160 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
10170 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
10180 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
10190 4e 6f 74 55 73 65 64 32 20 20 20 2f 2a 20 56 61  NotUsed2   /* Va
101a0 6c 75 65 20 6f 66 20 65 61 63 68 20 61 72 67 75  lue of each argu
101b0 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ment */.){.  con
101c0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
101d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
101e0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
101f0 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72  context);.  char
10200 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44   *zErr;.  UNUSED
10210 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
10220 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
10230 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
10240 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
10250 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66  "unable to use f
10260 75 6e 63 74 69 6f 6e 20 25 73 20 69 6e 20 74 68  unction %s in th
10270 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e 74  e requested cont
10280 65 78 74 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ext", zName);.  
10290 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
102a0 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45  rror(context, zE
102b0 72 72 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  rr, -1);.  sqlit
102c0 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 7d  e3_free(zErr);.}
102d0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
102e0 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
102f0 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
10300 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
10310 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
10320 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
10330 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
10340 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
10350 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
10360 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
10370 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
10380 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
10390 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
103a0 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
103b0 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
103c0 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
103d0 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
103e0 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
103f0 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
10400 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
10410 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
10420 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
10430 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
10440 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
10450 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
10460 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
10470 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
10480 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
10490 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
104a0 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
104b0 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
104c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
104d0 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
104e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
104f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
10500 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
10510 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
10520 72 20 2a 7a 43 6f 70 79 3b 0a 0a 23 69 66 64 65  r *zCopy;..#ifde
10530 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10540 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10550 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10560 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
10570 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32  me==0 || nArg<-2
10580 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10590 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
105a0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
105b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
105c0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
105d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 69    rc = sqlite3Fi
105e0 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
105f0 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
10600 54 45 5f 55 54 46 38 2c 20 30 29 21 3d 30 3b 0a  TE_UTF8, 0)!=0;.
10610 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10620 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
10630 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
10640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10650 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33   zCopy = sqlite3
10660 5f 6d 70 72 69 6e 74 66 28 7a 4e 61 6d 65 29 3b  _mprintf(zName);
10670 0a 20 20 69 66 28 20 7a 43 6f 70 79 3d 3d 30 20  .  if( zCopy==0 
10680 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
10690 4e 4f 4d 45 4d 3b 0a 20 20 72 65 74 75 72 6e 20  NOMEM;.  return 
106a0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
106b0 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  unction_v2(db, z
106c0 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
106d0 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 20 20 20 7a 43 6f 70 79 2c 20 73 71 6c 69 74      zCopy, sqlit
10700 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f  e3InvalidFunctio
10710 6e 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33  n, 0, 0, sqlite3
10720 5f 66 72 65 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64  _free);.}..#ifnd
10730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
10740 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  RACE./*.** Regis
10750 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63  ter a trace func
10760 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
10770 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
10780 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74  sly registered t
10790 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  race.** is retur
107a0 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
107b0 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69  ULL trace functi
107c0 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
107d0 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63   tracing is exec
107e0 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
107f0 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20  L.** trace is a 
10800 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
10810 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e  ction that is in
10820 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61  voked at the sta
10830 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51  rt of each.** SQ
10840 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  L statement..*/.
10850 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10860 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 76  MIT_DEPRECATED.v
10870 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61  oid *sqlite3_tra
10880 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ce(sqlite3 *db, 
10890 76 6f 69 64 28 2a 78 54 72 61 63 65 29 28 76 6f  void(*xTrace)(vo
108a0 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
108b0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
108c0 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69   void *pOld;..#i
108d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
108e0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
108f0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10900 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
10910 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
10920 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
10930 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
10940 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
10950 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
10960 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
10970 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b  = db->pTraceArg;
10980 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20  .  db->mTrace = 
10990 78 54 72 61 63 65 20 3f 20 53 51 4c 49 54 45 5f  xTrace ? SQLITE_
109a0 54 52 41 43 45 5f 4c 45 47 41 43 59 20 3a 20 30  TRACE_LEGACY : 0
109b0 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
109c0 20 28 69 6e 74 28 2a 29 28 75 33 32 2c 76 6f 69   (int(*)(u32,voi
109d0 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 29  d*,void*,void*))
109e0 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
109f0 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
10a00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10a10 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
10a20 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
10a30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10a40 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
10a50 54 45 44 20 2a 2f 0a 0a 2f 2a 20 52 65 67 69 73  TED */../* Regis
10a60 74 65 72 20 61 20 74 72 61 63 65 20 63 61 6c 6c  ter a trace call
10a70 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 76  back using the v
10a80 65 72 73 69 6f 6e 2d 32 20 69 6e 74 65 72 66 61  ersion-2 interfa
10a90 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
10aa0 65 33 5f 74 72 61 63 65 5f 76 32 28 0a 20 20 73  e3_trace_v2(.  s
10ab0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
10ae0 63 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ce this connecti
10af0 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
10b00 20 6d 54 72 61 63 65 2c 20 20 20 20 20 20 20 20   mTrace,        
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 76     /* Mask of ev
10b30 65 6e 74 73 20 74 6f 20 62 65 20 74 72 61 63 65  ents to be trace
10b40 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 54 72 61  d */.  int(*xTra
10b50 63 65 29 28 75 6e 73 69 67 6e 65 64 2c 76 6f 69  ce)(unsigned,voi
10b60 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 2c  d*,void*,void*),
10b70 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 74 6f    /* Callback to
10b80 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 76 6f 69   invoke */.  voi
10b90 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
10bc0 78 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  xt */.){.#ifdef 
10bd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
10be0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
10bf0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10c00 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
10c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
10c20 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
10c30 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
10c40 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
10c50 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6d 54 72  utex);.  if( mTr
10c60 61 63 65 3d 3d 30 20 29 20 78 54 72 61 63 65 20  ace==0 ) xTrace 
10c70 3d 20 30 3b 0a 20 20 69 66 28 20 78 54 72 61 63  = 0;.  if( xTrac
10c80 65 3d 3d 30 20 29 20 6d 54 72 61 63 65 20 3d 20  e==0 ) mTrace = 
10c90 30 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65 20  0;.  db->mTrace 
10ca0 3d 20 6d 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = mTrace;.  db->
10cb0 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b  xTrace = xTrace;
10cc0 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
10cd0 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
10ce0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10cf0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10d00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10d10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10d20 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
10d30 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
10d40 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  a profile functi
10d50 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72  on.  The pArg fr
10d60 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  om the previousl
10d70 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a  y registered .**
10d80 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
10d90 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  n is returned.  
10da0 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72  .**.** A NULL pr
10db0 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d  ofile function m
10dc0 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f  eans that no pro
10dd0 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74  filing is execut
10de0 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a  es.  A non-NULL.
10df0 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20  ** profile is a 
10e00 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
10e10 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e  ction that is in
10e20 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
10e30 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61  clusion of.** ea
10e40 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
10e50 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f   that is run..*/
10e60 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70  .void *sqlite3_p
10e70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  rofile(.  sqlite
10e80 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a  3 *db,.  void (*
10e90 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c  xProfile)(void*,
10ea0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
10eb0 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f  te_uint64),.  vo
10ec0 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f  id *pArg.){.  vo
10ed0 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
10ee0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10ef0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10f00 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10f10 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
10f20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
10f30 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
10f40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
10f50 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
10f60 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10f70 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
10f80 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a  b->pProfileArg;.
10f90 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d    db->xProfile =
10fa0 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d   xProfile;.  db-
10fb0 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70  >pProfileArg = p
10fc0 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
10fd0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
10fe0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10ff0 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
11000 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
11010 50 52 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64  PRECATED */.#end
11020 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11030 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  T_TRACE */../*.*
11040 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e  * Register a fun
11050 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
11060 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  ked when a trans
11070 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a  action commits..
11080 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65  ** If the invoke
11090 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  d function retur
110a0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
110b0 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63  n the commit bec
110c0 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61  omes a.** rollba
110d0 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ck..*/.void *sql
110e0 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
110f0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11110 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
11120 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
11130 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61  e */.  int (*xCa
11140 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
11150 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
11160 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63  invoke on each c
11170 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20  ommit */.  void 
11180 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
11190 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
111a0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
111b0 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
111c0 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
111d0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
111e0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
111f0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
11200 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
11210 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
11220 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
11230 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
11240 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11250 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11260 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43  .  pOld = db->pC
11270 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e  ommitArg;.  db->
11280 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
11290 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
112a0 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20  b->pCommitArg = 
112b0 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
112c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
112d0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
112e0 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOld;.}../*.** 
112f0 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
11300 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
11310 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
11320 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
11330 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
11340 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
11350 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11360 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
11370 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
11380 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
11390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
113a0 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
113b0 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
113c0 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
113d0 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
113e0 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  int,char const *
113f0 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71  ,char const *,sq
11400 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76  lite_int64),.  v
11410 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
11420 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
11430 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
11440 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
11450 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66  d *pRet;..#ifdef
11460 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
11470 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
11480 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
11490 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
114a0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
114b0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
114c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
114d0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
114e0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
114f0 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
11500 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20  ->pUpdateArg;.  
11510 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
11520 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
11530 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72  .  db->pUpdateAr
11540 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
11550 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11560 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11570 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
11580 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
11590 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
115a0 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
115b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
115c0 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
115d0 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
115e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
115f0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f  void *sqlite3_ro
11600 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73  llback_hook(.  s
11610 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
11620 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
11630 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
11640 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
11650 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
11660 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43  ck)(void*), /* C
11670 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
11680 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
116b0 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
116c0 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
116d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
116e0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
116f0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
11700 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
11710 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
11720 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
11730 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11740 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
11750 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11760 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
11770 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  et = db->pRollba
11780 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f  ckArg;.  db->xRo
11790 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d  llbackCallback =
117a0 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
117b0 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d  ->pRollbackArg =
117c0 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
117d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
117e0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
117f0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  n pRet;.}..#ifde
11800 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11810 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f  PREUPDATE_HOOK./
11820 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
11830 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
11840 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
11850 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
11860 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
11870 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
11880 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
11890 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
118a0 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70  d *sqlite3_preup
118b0 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  date_hook(.  sql
118c0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
118d0 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
118e0 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
118f0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
11900 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29  void(*xCallback)
11910 28 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c  (         /* Cal
11920 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
11930 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69  /.    void*,sqli
11940 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  te3*,int,char co
11950 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a  nst*,char const*
11960 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73  ,sqlite3_int64,s
11970 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20  qlite3_int64),. 
11980 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
11990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
119a0 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67  rst callback arg
119b0 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ument */.){.  vo
119c0 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
119d0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
119e0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
119f0 65 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64  et = db->pPreUpd
11a00 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ateArg;.  db->xP
11a10 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  reUpdateCallback
11a20 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
11a30 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
11a40 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
11a50 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11a60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11a70 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
11a80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
11a90 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
11aa0 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  OOK */..#ifndef 
11ab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
11ac0 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
11ad0 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
11ae0 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
11af0 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   by sqlite3_wal_
11b00 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
11b10 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ..** Invoke sqli
11b20 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
11b30 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72  nt if the number
11b40 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
11b50 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73  e log file.** is
11b60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71   greater than sq
11b70 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61  lite3.pWalArg ca
11b80 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  st to an integer
11b90 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66   (the value conf
11ba0 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c  igured by.** wal
11bb0 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
11bc0 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ))..*/ .int sqli
11bd0 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
11be0 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65  k(.  void *pClie
11bf0 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41  ntData,     /* A
11c00 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  rgument */.  sql
11c10 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
11c20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
11c30 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
11c40 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a  r *zDb,       /*
11c50 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   Database */.  i
11c60 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20  nt nFrame       
11c70 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11c80 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28   WAL */.){.  if(
11c90 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f   nFrame>=SQLITE_
11ca0 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65  PTR_TO_INT(pClie
11cb0 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73  ntData) ){.    s
11cc0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
11cd0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73  nMalloc();.    s
11ce0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
11cf0 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a  point(db, zDb);.
11d00 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
11d10 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
11d20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
11d30 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
11d40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
11d50 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  L */../*.** Conf
11d60 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33  igure an sqlite3
11d70 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
11d80 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69  back to automati
11d90 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
11da0 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
11db0 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fter committing 
11dc0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  a transaction if
11dd0 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d   there are nFram
11de0 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61  e or.** more fra
11df0 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
11e00 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72  ile. Passing zer
11e10 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20  o or a negative 
11e20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20  value as the.** 
11e30 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72  nFrame parameter
11e40 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61   disables automa
11e50 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  tic checkpoints 
11e60 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  entirely..**.** 
11e70 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  The callback reg
11e80 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20  istered by this 
11e90 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65  function replace
11ea0 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63  s any existing c
11eb0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73  allback.** regis
11ec0 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69  tered using sqli
11ed0 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20  te3_wal_hook(). 
11ee0 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74  Likewise, regist
11ef0 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b  ering a callback
11f00 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65  .** using sqlite
11f10 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73  3_wal_hook() dis
11f20 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61  ables the automa
11f30 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d  tic checkpoint m
11f40 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66  echanism.** conf
11f50 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66  igured by this f
11f60 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
11f70 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
11f80 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
11f90 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61  e3 *db, int nFra
11fa0 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  me){.#ifdef SQLI
11fb0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e  TE_OMIT_WAL.  UN
11fc0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
11fd0 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  b);.  UNUSED_PAR
11fe0 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a  AMETER(nFrame);.
11ff0 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c  #else.#ifdef SQL
12000 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
12010 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
12020 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
12030 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
12040 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12050 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e  ;.#endif.  if( n
12060 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73  Frame>0 ){.    s
12070 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
12080 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65  db, sqlite3WalDe
12090 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54  faultHook, SQLIT
120a0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72  E_INT_TO_PTR(nFr
120b0 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ame));.  }else{.
120c0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
120d0 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a  hook(db, 0, 0);.
120e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
120f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12100 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
12110 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
12120 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
12130 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
12140 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  n is written.** 
12150 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61  into the write-a
12160 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73  head-log by this
12170 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12180 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
12190 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
121a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121c0 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
121d0 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62   hook to this db
121e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
121f0 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
12200 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  d *, sqlite3*, c
12210 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
12220 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
12250 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
12260 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29  xCallback() */.)
12270 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
12280 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64  _OMIT_WAL.  void
12290 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53   *pRet;.#ifdef S
122a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
122b0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
122c0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
122d0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
122e0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
122f0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
12300 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
12310 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12320 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
12330 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
12340 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78  pWalArg;.  db->x
12350 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  WalCallback = xC
12360 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
12370 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  WalArg = pArg;. 
12380 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12390 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
123a0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
123b0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
123c0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
123d0 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
123e0 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e  abase zDb..*/.in
123f0 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
12400 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73  eckpoint_v2(.  s
12410 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12430 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
12440 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
12450 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
12460 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
12470 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
12480 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ase (or NULL) */
12490 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20  .  int eMode,   
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45     /* SQLITE_CHE
124c0 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20  CKPOINT_* value 
124d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  */.  int *pnLog,
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
12500 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20  e of WAL log in 
12510 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20  frames */.  int 
12520 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20  *pnCkpt         
12530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12540 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72  UT: Total number
12550 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b   of frames check
12560 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69  pointed */.){.#i
12570 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12580 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51  _WAL.  return SQ
12590 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
125a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
125d0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53  */.  int iDb = S
125e0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
125f0 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e  ED;  /* sqlite3.
12600 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64  aDb[] index of d
12610 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  b to checkpoint 
12620 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
12630 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
12640 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
12650 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
12660 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
12670 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12680 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69  #endif..  /* Ini
12690 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70  tialize the outp
126a0 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ut variables to 
126b0 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  -1 in case an er
126c0 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
126d0 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e   if( pnLog ) *pn
126e0 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Log = -1;.  if( 
126f0 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74  pnCkpt ) *pnCkpt
12700 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74   = -1;..  assert
12710 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
12720 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29  INT_PASSIVE==0 )
12730 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
12740 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
12750 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  LL==1 );.  asser
12760 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
12770 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20  OINT_RESTART==2 
12780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
12790 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
127a0 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20  RUNCATE==3 );.  
127b0 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
127c0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
127d0 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
127e0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
127f0 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f  RUNCATE ){.    /
12800 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
12810 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54 68 65  -03996-12088 The
12820 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73   M parameter mus
12830 74 20 62 65 20 61 20 76 61 6c 69 64 20 63 68 65  t be a valid che
12840 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d  ckpoint.    ** m
12850 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75  ode: */.    retu
12860 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
12870 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
12880 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
12890 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
128a0 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
128b0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
128c0 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
128d0 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
128e0 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
128f0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
12900 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12910 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
12920 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
12930 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
12940 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
12950 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  .    db->busyHan
12960 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
12970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12980 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69  Checkpoint(db, i
12990 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Db, eMode, pnLog
129a0 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73  , pnCkpt);.    s
129b0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
129c0 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  rc);.  }.  rc = 
129d0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
129e0 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  b, rc);..  /* If
129f0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63   there are no ac
12a00 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2c  tive statements,
12a10 20 63 6c 65 61 72 20 74 68 65 20 69 6e 74 65 72   clear the inter
12a20 72 75 70 74 20 66 6c 61 67 20 61 74 20 74 68 69  rupt flag at thi
12a30 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a  s.  ** point.  *
12a40 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62  /.  if( db->nVdb
12a50 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20  eActive==0 ){.  
12a60 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
12a70 72 75 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  rupted = 0;.  }.
12a80 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12a90 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
12aa0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12ab0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
12ac0 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
12ad0 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62  base zDb. If zDb
12ae0 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20   is NULL, or if 
12af0 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70  the buffer zDb p
12b00 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74  oints.** to cont
12b10 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  ains a zero-leng
12b20 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61  th string, all a
12b30 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
12b40 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70  s are .** checkp
12b50 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ointed..*/.int s
12b60 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
12b70 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
12b80 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
12b90 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Db){.  /* EVIDEN
12ba0 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32  CE-OF: R-41613-2
12bb0 30 35 35 33 20 54 68 65 20 73 71 6c 69 74 65 33  0553 The sqlite3
12bc0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
12bd0 44 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c 65  D,X) is equivale
12be0 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74  nt to.  ** sqlit
12bf0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
12c00 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f  t_v2(D,X,SQLITE_
12c10 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
12c20 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65  VE,0,0). */.  re
12c30 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  turn sqlite3_wal
12c40 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
12c50 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45  b,zDb,SQLITE_CHE
12c60 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
12c70 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  0,0);.}..#ifndef
12c80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
12c90 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65  ./*.** Run a che
12ca0 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62  ckpoint on datab
12cb0 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73  ase iDb. This is
12cc0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61   a no-op if data
12cd0 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e  base iDb is.** n
12ce0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ot currently ope
12cf0 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a  n in WAL mode..*
12d00 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
12d10 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
12d20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
12d30 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
12d40 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
12d50 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
12d60 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20  TE_LOCKED and a 
12d70 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f  checkpoint is no
12d80 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20  t attempted. If 
12d90 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  .** an error occ
12da0 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e  urs while runnin
12db0 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  g the checkpoint
12dc0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
12dd0 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
12de0 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c  turned (i.e. SQL
12df0 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65  ITE_IOERR). Othe
12e00 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
12e10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
12e20 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  x on database ha
12e30 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62  ndle db should b
12e40 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61  e held by the ca
12e50 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a  ller. The mutex.
12e60 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
12e70 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20  th the specific 
12e80 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65  b-tree being che
12e90 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b  ckpointed is tak
12ea0 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75  en by.** this fu
12eb0 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65  nction while the
12ec0 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72   checkpoint is r
12ed0 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  unning..**.** If
12ee0 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53   iDb is passed S
12ef0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
12f00 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74  ED, then all att
12f10 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
12f20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  are.** checkpoin
12f30 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ted. If an error
12f40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
12f50 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  it is returned i
12f60 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20  mmediately -.** 
12f70 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  no attempt is ma
12f80 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  de to checkpoint
12f90 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64   any remaining d
12fa0 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
12fb0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
12fc0 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  is one of SQLITE
12fd0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
12fe0 49 56 45 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41  IVE, FULL, RESTA
12ff0 52 54 0a 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54  RT.** or TRUNCAT
13000 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
13010 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  3Checkpoint(sqli
13020 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
13030 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74  , int eMode, int
13040 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e   *pnLog, int *pn
13050 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Ckpt){.  int rc 
13060 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
13070 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13080 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
13090 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
130b0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
130c0 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64  through attached
130d0 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42   dbs */.  int bB
130e0 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  usy = 0;        
130f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13100 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  e if SQLITE_BUSY
13110 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e   has been encoun
13120 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  tered */..  asse
13130 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13140 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
13150 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
13160 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d  pnLog || *pnLog=
13170 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =-1 );.  assert(
13180 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43   !pnCkpt || *pnC
13190 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f  kpt==-1 );..  fo
131a0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
131b0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
131c0 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  K; i++){.    if(
131d0 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d   i==iDb || iDb==
131e0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
131f0 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  HED ){.      rc 
13200 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68  = sqlite3BtreeCh
13210 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62  eckpoint(db->aDb
13220 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20  [i].pBt, eMode, 
13230 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
13240 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b        pnLog = 0;
13250 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20  .      pnCkpt = 
13260 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  0;.      if( rc=
13270 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
13280 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20          bBusy = 
13290 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
132a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
132b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
132c0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
132d0 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20  TE_OK && bBusy) 
132e0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
132f0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
13300 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
13310 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
13320 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
13330 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d  true if main-mem
13340 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ory should be us
13350 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
13360 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
13370 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20  e for transient 
13380 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20  pager files and 
13390 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
133a0 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ls..** The value
133b0 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64   returned depend
133c0 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
133d0 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  f db->temp_store
133e0 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72   (runtime.** par
133f0 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20  ameter) and the 
13400 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c  compile time val
13410 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d  ue of SQLITE_TEM
13420 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20  P_STORE. The.** 
13430 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
13440 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65  describes the re
13450 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
13460 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c  en these two val
13470 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20  ues.** and this 
13480 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
13490 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   value..**.**   
134a0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
134b0 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73  E     db->temp_s
134c0 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f  tore     Locatio
134d0 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64  n of temporary d
134e0 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d  atabase.**   ---
134f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
13500 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
13510 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
13520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13530 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
13560 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
13570 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
135a0 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
135b0 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
135c0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
135d0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
135e0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
135f0 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
13600 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
13610 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
13620 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
13630 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
13640 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
13650 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
13670 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
13680 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
136c0 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20  urn 1).**   2   
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
136f0 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
13700 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33  return 1).**   3
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
13730 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
13740 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a    (return 1).*/.
13750 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49  int sqlite3TempI
13760 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71  nMemory(const sq
13770 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20  lite3 *db){.#if 
13780 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
13790 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20  E==1.  return ( 
137a0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d  db->temp_store==
137b0 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  2 );.#endif.#if 
137c0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
137d0 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20  E==2.  return ( 
137e0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d  db->temp_store!=
137f0 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1 );.#endif.#if 
13800 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
13810 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41  E==3.  UNUSED_PA
13820 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72  RAMETER(db);.  r
13830 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
13840 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
13850 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54  STORE<1 || SQLIT
13860 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20  E_TEMP_STORE>3. 
13870 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13880 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(db);.  return 
13890 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
138a0 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
138b0 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
138c0 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
138d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
138e0 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
138f0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
13900 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
13910 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
13920 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
13930 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
13940 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
13950 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
13960 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69  M_BKPT);.  }.  i
13970 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
13980 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
13990 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
139a0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
139b0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
139c0 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  T);.  }.  sqlite
139d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
139e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
139f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13a00 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69   ){.    z = sqli
13a10 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
13a20 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
13a30 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63  }else{.    testc
13a40 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30  ase( db->pErr==0
13a50 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61   );.    z = (cha
13a60 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
13a70 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b  _text(db->pErr);
13a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
13a90 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13aa0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
13ab0 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
13ac0 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
13ad0 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rCode);.    }.  
13ae0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
13af0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
13b00 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
13b10 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13b20 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
13b30 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36  ** Return UTF-16
13b40 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
13b50 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
13b60 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
13b70 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
13b80 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  r..*/.const void
13b90 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
13ba0 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  16(sqlite3 *db){
13bb0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
13bc0 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d  u16 outOfMem[] =
13bd0 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c   {.    'o', 'u',
13be0 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   't', ' ', 'o', 
13bf0 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27  'f', ' ', 'm', '
13c00 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72  e', 'm', 'o', 'r
13c10 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20  ', 'y', 0.  };. 
13c20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
13c30 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20  6 misuse[] = {. 
13c40 20 20 20 27 62 27 2c 20 27 61 27 2c 20 27 64 27     'b', 'a', 'd'
13c50 2c 20 27 20 27 2c 20 27 70 27 2c 20 27 61 27 2c  , ' ', 'p', 'a',
13c60 20 27 72 27 2c 20 27 61 27 2c 20 27 6d 27 2c 20   'r', 'a', 'm', 
13c70 27 65 27 2c 20 27 74 27 2c 20 27 65 27 2c 20 27  'e', 't', 'e', '
13c80 72 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6f 27  r', ' ',.    'o'
13c90 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 'r', ' ', 'o',
13ca0 20 27 74 27 2c 20 27 68 27 2c 20 27 65 27 2c 20   't', 'h', 'e', 
13cb0 27 72 27 2c 20 27 20 27 2c 20 27 41 27 2c 20 27  'r', ' ', 'A', '
13cc0 50 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a 20 20  P', 'I', ' ',.  
13cd0 20 20 27 6d 27 2c 20 27 69 27 2c 20 27 73 27 2c    'm', 'i', 's',
13ce0 20 27 75 27 2c 20 27 73 27 2c 20 27 65 27 2c 20   'u', 's', 'e', 
13cf0 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20  0.  };..  const 
13d00 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21  void *z;.  if( !
13d10 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
13d20 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
13d30 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  m;.  }.  if( !sq
13d40 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
13d50 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
13d60 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
13d70 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20   *)misuse;.  }. 
13d80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
13d90 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
13da0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13db0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
13dc0 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66   = (void *)outOf
13dd0 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Mem;.  }else{.  
13de0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
13df0 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
13e00 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  Err);.    if( z=
13e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
13e20 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
13e30 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c  db, db->errCode,
13e40 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
13e50 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20  b->errCode));.  
13e60 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
13e70 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
13e80 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >pErr);.    }.  
13e90 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
13ea0 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20  may have failed 
13eb0 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20  within the call 
13ec0 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  to sqlite3_value
13ed0 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a  _text16().    **
13ee0 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20   above. If this 
13ef0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
13f00 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  n the db->malloc
13f10 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64  Failed flag need
13f20 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
13f30 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65  leared before re
13f40 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73  turning. Do this
13f50 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
13f60 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a  ad of via.    **
13f70 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
13f80 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74  ), to avoid sett
13f90 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
13fa0 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65   handle error me
13fb0 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssage..    */.  
13fc0 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61    sqlite3OomClea
13fd0 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r(db);.  }.  sql
13fe0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13ff0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
14000 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
14010 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14020 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
14030 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   Return the most
14040 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f   recent error co
14050 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
14060 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e  an SQLite routin
14070 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a  e. If NULL is.**
14080 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
14090 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73  function, we ass
140a0 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  ume a malloc() f
140b0 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c  ailed during sql
140c0 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a  ite3_open()..*/.
140d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63  int sqlite3_errc
140e0 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
140f0 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
14100 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
14110 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
14120 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14130 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
14140 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
14150 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14160 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
14170 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14180 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
14190 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
141a0 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
141b0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
141c0 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
141d0 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
141e0 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
141f0 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
14200 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
14210 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
14220 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
14230 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
14240 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
14250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
14260 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
14270 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
14280 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
14290 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71  _system_errno(sq
142a0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
142b0 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53  turn db ? db->iS
142c0 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20  ysErrno : 0;.}  
142d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
142e0 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
142f0 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
14300 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
14310 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
14320 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c  ument.  For now,
14330 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c   this simply cal
14340 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ls the internal 
14350 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a  sqlite3ErrStr().
14360 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
14370 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
14380 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72  te3_errstr(int r
14390 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  c){.  return sql
143a0 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a  ite3ErrStr(rc);.
143b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
143c0 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
143d0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
143e0 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
143f0 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
14400 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
14410 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
14420 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
14430 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
14440 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74  te3* db,.  const
14450 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
14460 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a   u8 enc,.  void*
14470 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
14480 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
14490 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
144a0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
144b0 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
144c0 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  id*).){.  CollSe
144d0 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
144e0 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72  enc2;.  .  asser
144f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14500 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
14510 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c   );..  /* If SQL
14520 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
14530 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
14540 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
14550 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
14560 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
14570 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
14580 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
14590 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
145a0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
145b0 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
145c0 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
145d0 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
145e0 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74   enc2 = enc;.  t
145f0 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53  estcase( enc2==S
14600 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20  QLITE_UTF16 );. 
14610 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
14620 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
14630 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65  IGNED );.  if( e
14640 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
14650 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54  6 || enc2==SQLIT
14660 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
14670 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51  ){.    enc2 = SQ
14680 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
14690 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32  ;.  }.  if( enc2
146a0 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  <SQLITE_UTF8 || 
146b0 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31  enc2>SQLITE_UTF1
146c0 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  6BE ){.    retur
146d0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
146e0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
146f0 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61  Check if this ca
14700 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f  ll is removing o
14710 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65  r replacing an e
14720 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  xisting collatio
14730 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65  n .  ** sequence
14740 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65  . If so, and the
14750 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
14760 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20  s, return busy. 
14770 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72  If there.  ** ar
14780 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
14790 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
147a0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
147b0 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
147c0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
147d0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
147e0 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
147f0 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20  0);.  if( pColl 
14800 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  && pColl->xCmp )
14810 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56  {.    if( db->nV
14820 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20  dbeActive ){.   
14830 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
14840 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
14850 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
14860 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
14870 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74  te/modify collat
14880 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65  ion sequence due
14890 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
148a0 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72  ments");.      r
148b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
148c0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  Y;.    }.    sql
148d0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
148e0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c  edStatements(db,
148f0 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   0);..    /* If 
14900 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
14910 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65  ce pColl was cre
14920 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  ated directly by
14930 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a   a call to.    *
14940 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
14950 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20  _collation, and 
14960 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  not generated by
14970 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c   synthCollSeq(),
14980 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79  .    ** then any
14990 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20   copies made by 
149a0 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e  synthCollSeq() n
149b0 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  eed to be invali
149c0 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  dated..    ** Al
149d0 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65  so, collation de
149e0 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53  structor - CollS
149f0 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63  eq.xDel() - func
14a00 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20  tion may need.  
14a10 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65    ** to be calle
14a20 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69  d..    */ .    i
14a30 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26  f( (pColl->enc &
14a40 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
14a50 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b  LIGNED)==enc2 ){
14a60 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
14a70 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  aColl = sqlite3H
14a80 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
14a90 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20  llSeq, zName);. 
14aa0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
14ab0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
14ac0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
14ad0 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
14ae0 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
14af0 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
14b00 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
14b10 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
14b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
14b30 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
14b40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14b50 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
14b60 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
14b70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14b80 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
14b90 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
14ba0 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
14bb0 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
14bc0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
14bd0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14be0 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
14bf0 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f   xCompare;.  pCo
14c00 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
14c10 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20  ;.  pColl->xDel 
14c20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d  = xDel;.  pColl-
14c30 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
14c40 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
14c50 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
14c60 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
14c70 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
14c80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14c90 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
14ca0 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
14cb0 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
14cc0 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
14cd0 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
14ce0 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
14cf0 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
14d00 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
14d10 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
14d20 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
14d30 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
14d40 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
14d50 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
14d60 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
14d70 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
14d80 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
14d90 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
14da0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
14db0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
14dc0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
14dd0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
14de0 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
14df0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
14e00 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
14e10 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
14e20 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
14e30 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
14e40 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
14e50 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49  UMBER,      /* I
14e60 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35  MP: R-38091-3235
14e70 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41  2 */.  SQLITE_MA
14e80 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
14e90 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  .  SQLITE_MAX_WO
14ea0 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b  RKER_THREADS,.};
14eb0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
14ec0 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  e the hard limit
14ed0 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61  s are set to rea
14ee0 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a  sonable values.*
14ef0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
14f00 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
14f10 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
14f20 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
14f30 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
14f40 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
14f50 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _SQL_LENGTH<100.
14f60 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
14f70 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
14f80 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
14f90 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
14fa0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
14fb0 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  GTH>SQLITE_MAX_L
14fc0 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51  ENGTH.# error SQ
14fd0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
14fe0 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  GTH must not be 
14ff0 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
15000 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
15010 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
15020 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
15030 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53  LECT<2.# error S
15040 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
15050 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  ND_SELECT must b
15060 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e  e at least 2.#en
15070 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15080 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20  AX_VDBE_OP<40.# 
15090 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
150a0 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65  _VDBE_OP must be
150b0 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e   at least 40.#en
150c0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
150d0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c  AX_FUNCTION_ARG<
150e0 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
150f0 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37  FUNCTION_ARG>127
15100 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
15110 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
15120 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
15130 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69   0 and 127.#endi
15140 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
15150 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
15160 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
15170 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53  ED>125.# error S
15180 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
15190 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
151a0 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e  en 0 and 125.#en
151b0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
151c0 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
151d0 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72  LENGTH<1.# error
151e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
151f0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
15200 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
15210 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
15220 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
15230 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
15240 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
15250 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
15260 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66  32767.#endif.#if
15270 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
15280 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72  GER_DEPTH<1.# er
15290 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ror SQLITE_MAX_T
152a0 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73  RIGGER_DEPTH mus
152b0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
152c0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
152d0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
152e0 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45  EADS<0 || SQLITE
152f0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
15300 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53  ADS>50.# error S
15310 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
15320 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65  _THREADS must be
15330 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35   between 0 and 5
15340 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
15350 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
15360 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
15370 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
15380 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
15390 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
153a0 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
153b0 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
153c0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
153d0 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
153e0 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
153f0 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
15400 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
15410 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
15420 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
15430 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
15440 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
15450 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
15460 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
15470 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
15480 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
15490 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
154a0 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
154b0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
154c0 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
154d0 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
154e0 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  it;..#ifdef SQLI
154f0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
15500 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
15510 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
15520 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
15530 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
15540 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
15550 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
15560 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
15570 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
15580 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
15590 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
155a0 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
155b0 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
155c0 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
155d0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
155e0 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
155f0 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
15600 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
15610 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
15620 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
15630 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
15640 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
15650 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
15660 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15670 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
15680 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
15690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
156a0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
156b0 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
156c0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
156d0 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
156e0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
156f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
15700 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
15710 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
15720 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15730 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
15740 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
15750 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
15760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15770 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15780 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
15790 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
157a0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
157b0 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
157c0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
157d0 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
157e0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
157f0 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
15800 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
15810 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
15820 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
15830 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
15840 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15850 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15860 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
15870 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
15880 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
15890 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
158a0 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
158b0 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
158f0 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
15900 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
15910 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15920 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15930 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
15940 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
15950 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
15960 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15970 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15980 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
15990 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
159a0 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
159b0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
159c0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
159d0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
159e0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ==SQLITE_MAX_WOR
159f0 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20  KER_THREADS );. 
15a00 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
15a10 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
15a20 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EADS==(SQLITE_N_
15a30 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
15a40 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
15a50 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
15a60 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
15a70 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
15a80 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
15a90 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
15aa0 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
15ab0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
15ac0 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
15ad0 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
15ae0 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
15af0 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
15b00 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
15b10 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
15b20 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
15b30 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
15b40 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
15b50 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
15b60 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
15b70 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
15b80 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ba0 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
15bb0 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
15bc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15bd0 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
15be0 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
15bf0 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
15c00 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
15c10 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
15c20 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
15c30 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
15c40 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
15c50 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
15c60 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
15c70 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
15c80 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
15c90 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
15ca0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
15cb0 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
15cc0 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
15cd0 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
15ce0 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
15cf0 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
15d00 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
15d10 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
15d20 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
15d30 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
15d40 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
15d50 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
15d60 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
15d70 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
15d80 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
15d90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
15da0 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
15db0 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
15dc0 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
15dd0 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
15de0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
15df0 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
15e00 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
15e10 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
15e20 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
15e30 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
15e40 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
15e50 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
15e60 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
15e70 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
15e80 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
15e90 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
15ea0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
15eb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
15ec0 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
15ed0 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
15ee0 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
15ef0 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
15f00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15f10 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
15f20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
15f30 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
15f40 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
15f50 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
15f60 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
15f70 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
15f80 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
15f90 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
15fa0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
15fb0 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
15fc0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
15fd0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15fe0 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
15ff0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
16000 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
16010 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
16020 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
16030 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
16040 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
16050 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
16060 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
16070 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
16080 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
16090 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
160a0 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
160b0 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
160c0 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
160d0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
160e0 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
160f0 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
16100 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
16110 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
16120 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
16130 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
16140 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16160 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
16170 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
16180 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
16190 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
161a0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
161b0 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
161c0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
161d0 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
161e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
161f0 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
16200 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
16230 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
16240 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
16250 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
16260 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
16270 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
16280 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
16290 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
162a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
162b0 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
162c0 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
162d0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
162e0 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
162f0 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
16300 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
16310 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
16320 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
16330 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
16340 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
16350 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16360 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20  EN_URI)         
16370 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38      /* IMP: R-48
16380 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20  725-32206 */.   
16390 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
163a0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
163b0 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50  bOpenUri) /* IMP
163c0 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20  : R-51689-46548 
163d0 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  */.   && nUri>=5
163e0 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
163f0 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
16400 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d  /* IMP: R-57884-
16410 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20  37496 */.  ){.  
16420 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
16430 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16450 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
16460 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
16470 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
164a0 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
164b0 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
164c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
164d0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
164e0 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
164f0 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d  .    u64 nByte =
16500 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
16510 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
16520 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
16530 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
16540 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
16550 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
16560 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
16570 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
16580 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
16590 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
165a0 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
165b0 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
165c0 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
165d0 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
165e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
165f0 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
16600 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
16610 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
16620 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
16630 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
16640 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
16650 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
16660 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16670 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20  NOMEM_BKPT;..   
16680 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66   iIn = 5;.#ifdef
16690 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52   SQLITE_ALLOW_UR
166a0 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20  I_AUTHORITY.    
166b0 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
166c0 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30  +5, "///", 3)==0
166d0 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
166e0 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  7;.      /* The 
166f0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74  following condit
16700 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20  ion causes URIs 
16710 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e  with five leadin
16720 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
16730 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c       ** like fil
16740 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68  e://///host/path
16750 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64   to be converted
16760 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20   into UNCs like 
16770 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20  //host/path..   
16780 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63     ** The correc
16790 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55  t URI for that U
167a0 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20  NC has only two 
167b0 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20  or four leading 
167c0 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
167d0 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73     ** file://hos
167e0 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f  t/path or file:/
167f0 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42  ///host/path.  B
16800 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61  ut 5 leading sla
16810 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20  shes is a .     
16820 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72   ** common error
16830 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73  , we are told, s
16840 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61  o we handle it a
16850 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
16860 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
16870 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22  trncmp(zUri+7, "
16880 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69  ///", 3)==0 ){ i
16890 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73  In++; }.    }els
168a0 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55  e if( strncmp(zU
168b0 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f  ri+5, "//localho
168c0 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a  st/", 12)==0 ){.
168d0 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a        iIn = 16;.
168e0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
168f0 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73  /* Discard the s
16900 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72  cheme and author
16910 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  ity segments of 
16920 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20  the URI. */.    
16930 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27  if( zUri[5]=='/'
16940 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27   && zUri[6]=='/'
16950 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
16960 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  7;.      while( 
16970 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
16980 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49  i[iIn]!='/' ) iI
16990 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  n++;.      if( i
169a0 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31  In!=7 && (iIn!=1
169b0 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63  6 || memcmp("loc
169c0 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37  alhost", &zUri[7
169d0 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20  ], 9)) ){.      
169e0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
169f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
16a00 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
16a10 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20  rity: %.*s", .  
16a20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c            iIn-7,
16a30 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20   &zUri[7]);.    
16a40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16a50 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
16a60 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
16a70 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
16a80 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
16a90 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d  Copy the filenam
16aa0 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20  e and any query 
16ab0 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20  parameters into 
16ac0 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72  the zFile buffer
16ad0 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65  . .    ** Decode
16ae0 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65   %HH escape code
16af0 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  s along the way.
16b00 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
16b10 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  Within this loop
16b20 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74  , variable eStat
16b30 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
16b40 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e  0, 1 or 2, depen
16b50 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ding.    ** on t
16b60 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
16b70 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  xt. As follows:.
16b80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
16b90 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d  0: Parsing file-
16ba0 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31  name..    **   1
16bb0 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73  : Parsing name s
16bc0 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
16bd0 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
16be0 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20  ameter..    **  
16bf0 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75   2: Parsing valu
16c00 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
16c10 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
16c20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
16c30 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30  /.    eState = 0
16c40 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20  ;.    while( (c 
16c50 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
16c60 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20  && c!='#' ){.   
16c70 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
16c80 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20  if( c=='%' .    
16c90 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
16ca0 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29  digit(zUri[iIn])
16cb0 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
16cc0 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
16cd0 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20  [iIn+1]) .      
16ce0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
16cf0 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48  ctet = (sqlite3H
16d00 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
16d10 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20  ++]) << 4);.    
16d20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c      octet += sql
16d30 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
16d40 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20  i[iIn++]);..    
16d50 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65      assert( octe
16d60 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35  t>=0 && octet<25
16d70 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
16d80 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66   octet==0 ){.#if
16d90 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
16da0 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a  LE_URI_00_ERROR.
16db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
16dc0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
16dd0 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
16de0 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
16df0 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
16e00 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
16e10 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
16e20 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
16e30 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
16e40 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
16e50 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
16e60 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
16e70 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
16e80 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
16e90 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
16ea0 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
16eb0 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
16ec0 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
16ed0 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
16ee0 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
16ef0 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
16f00 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
16f10 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
16f20 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
16f40 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
16f50 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
16f60 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
16f70 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
16f80 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
16f90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
16fa0 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
16fb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
16fc0 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20  ontinue;.#else. 
16fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 45           /* If E
16fe0 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52  NABLE_URI_00_ERR
16ff0 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c 20 22  OR is defined, "
17000 25 30 30 22 20 69 6e 20 61 20 55 52 49 20 69 73  %00" in a URI is
17010 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
17020 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
17030 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17040 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65 64 20  ntf("unexpected 
17050 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b 0a 20  %%00 in uri");. 
17060 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
17070 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
17080 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
17090 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66  _uri_out;.#endif
170a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
170b0 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20     c = octet;.  
170c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
170d0 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27  tate==1 && (c=='
170e0 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b  &' || c=='=') ){
170f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
17100 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b  le[iOut-1]==0 ){
17110 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
17120 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61   empty option na
17130 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20  me. Ignore this 
17140 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65  option altogethe
17150 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
17160 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
17170 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
17180 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31  #' && zUri[iIn-1
17190 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='&' ) iIn++;.
171a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
171b0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
171c0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27        if( c=='&'
171d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
171e0 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
171f0 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0';.        }els
17200 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  e{.          eSt
17210 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
17220 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30   }.        c = 0
17230 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
17240 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20  ( (eState==0 && 
17250 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61  c=='?') || (eSta
17260 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29  te==2 && c=='&')
17270 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
17280 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  0;.        eStat
17290 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
172a0 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
172b0 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
172c0 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20    if( eState==1 
172d0 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20  ) zFile[iOut++] 
172e0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
172f0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
17300 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
17310 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  ++] = '\0';..   
17320 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
17330 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69  re were any opti
17340 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68  ons specified th
17350 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74  at should be int
17360 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a  erpreted .    **
17370 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74   here. Options t
17380 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
17390 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ted here include
173a0 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65   "vfs" and those
173b0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72   that.    ** cor
173c0 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73  respond to flags
173d0 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
173e0 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  sed to the sqlit
173f0 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20  e3_open_v2().   
17400 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20   ** method. */. 
17410 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65     zOpt = &zFile
17420 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
17430 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20  (zFile)+1];.    
17440 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29  while( zOpt[0] )
17450 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74  {.      int nOpt
17460 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
17470 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20  30(zOpt);.      
17480 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f  char *zVal = &zO
17490 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20  pt[nOpt+1];.    
174a0 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
174b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61  ite3Strlen30(zVa
174c0 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  l);..      if( n
174d0 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  Opt==3 && memcmp
174e0 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29  ("vfs", zOpt, 3)
174f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
17500 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20  Vfs = zVal;.    
17510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17520 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
17530 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
17540 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
17550 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a        int mode;.
17560 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65          } *aMode
17570 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
17580 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20  ar *zModeType = 
17590 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d  0;.        int m
175a0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
175b0 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a   int limit = 0;.
175c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
175d0 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==5 && memcmp("
175e0 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29  cache", zOpt, 5)
175f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
17600 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
17610 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f  penMode aCacheMo
17620 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
17630 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c       { "shared",
17640 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48    SQLITE_OPEN_SH
17650 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
17660 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76           { "priv
17670 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ate", SQLITE_OPE
17680 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
17690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
176a0 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
176b0 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
176c0 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
176d0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51  N_SHAREDCACHE|SQ
176e0 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
176f0 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20  ECACHE;.        
17700 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65    aMode = aCache
17710 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
17720 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20  limit = mask;.  
17730 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
17740 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20  e = "cache";.   
17750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17760 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65  f( nOpt==4 && me
17770 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70  mcmp("mode", zOp
17780 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 4)==0 ){.    
17790 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
177a0 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70  uct OpenMode aOp
177b0 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  enMode[] = {.   
177c0 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c           { "ro",
177d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
177e0 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
177f0 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53        { "rw",  S
17800 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17810 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20  RITE }, .       
17820 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51       { "rwc", SQ
17830 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17840 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
17850 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
17860 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72          { "memor
17870 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  y", SQLITE_OPEN_
17880 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20  MEMORY },.      
17890 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
178a0 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
178b0 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
178c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
178d0 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY | SQLITE_OPEN
178e0 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17900 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
17910 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
17920 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20  _MEMORY;.       
17930 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e     aMode = aOpen
17940 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
17950 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66  limit = mask & f
17960 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
17970 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63  zModeType = "acc
17980 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ess";.        }.
17990 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f  .        if( aMo
179a0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
179b0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
179c0 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20   int mode = 0;. 
179d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
179e0 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b  ; aMode[i].z; i+
179f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
17a00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
17a10 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20  aMode[i].z;.    
17a20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c          if( nVal
17a30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
17a40 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  0(z) && 0==memcm
17a50 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29  p(zVal, z, nVal)
17a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17a70 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69    mode = aMode[i
17a80 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].mode;.        
17a90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17aa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17ac0 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a   if( mode==0 ){.
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
17ae0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17af0 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
17b00 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a   %s mode: %s", z
17b10 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
17b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17b30 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
17b40 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
17b50 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
17b60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17b70 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20        if( (mode 
17b80 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
17b90 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a  EMORY)>limit ){.
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
17bb0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17bc0 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
17bd0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
17be0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
17c10 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
17c20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
17c30 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
17c40 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
17c50 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
17c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17c70 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
17c80 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
17c90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17ca0 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
17cb0 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
17cc0 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
17cd0 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
17ce0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72  te3_malloc64(nUr
17cf0 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
17d00 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
17d10 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
17d20 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 7b  .    if( nUri ){
17d30 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  .      memcpy(zF
17d40 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
17d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
17d60 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
17d70 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
17d80 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
17d90 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
17da0 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
17db0 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
17dc0 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
17dd0 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
17de0 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
17df0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17e00 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
17e10 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
17e20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
17e30 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
17e40 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
17e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17e60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17e70 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
17e80 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
17e90 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
17ea0 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
17eb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17ec0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
17ed0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
17ee0 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
17ef0 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
17f00 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
17f10 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
17f20 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
17f30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17f40 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
17f50 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
17f60 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
17f70 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
17f80 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
17f90 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
17fa0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
17fb0 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
17fc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
17fd0 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
17fe0 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
17ff0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
18000 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
18010 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
18020 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
18030 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18040 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
18050 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
18060 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
18070 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
18080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18090 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
180a0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
180b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
180e0 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
180f0 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
18100 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
18110 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
18120 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
18130 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
18140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18150 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
18160 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
18170 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
18180 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
181a0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
181b0 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
181c0 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ri() */..#ifdef 
181d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
181e0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
181f0 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
18200 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
18210 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
18220 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
18230 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
18240 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
18250 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
18260 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
18270 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
18280 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
18290 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
182a0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
182b0 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
182c0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
182d0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
182e0 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
182f0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
18300 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
18310 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
18320 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
18330 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
18340 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
18350 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
18360 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18370 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
18380 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67 73    }..  if( flags
18390 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
183a0 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
183b0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
183c0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
183d0 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
183e0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
183f0 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
18400 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
18410 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
18420 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
18430 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
18440 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
18450 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
18460 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
18470 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
18480 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
18490 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
184a0 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
184b0 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
184c0 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
184d0 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
184e0 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
184f0 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
18500 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
18510 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
18520 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
18530 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
18540 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
18550 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f  DWRITE, SQLITE_O
18560 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49  PEN_CREATE, SQLI
18570 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
18580 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  CHE,.  ** SQLITE
18590 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
185a0 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73  HE, and some res
185b0 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c  erved bits.  Sil
185c0 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
185d0 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
185e0 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
185f0 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
18600 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
18610 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
18620 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
18630 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
18640 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18650 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
18660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
18680 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
18690 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
186a0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
186b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
186c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
186d0 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
186e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
186f0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
18700 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
18710 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18720 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
18730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
18750 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
18760 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18770 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
18780 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
18790 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
187a0 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
187b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
187c0 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
187d0 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
187e0 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
187f0 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
18800 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
18810 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
18820 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
18830 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
18840 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
18850 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
18860 66 65 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  fe .#ifdef SQLIT
18870 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 54 48  E_ENABLE_MULTITH
18880 52 45 41 44 45 44 5f 43 48 45 43 4b 53 0a 20 20  READED_CHECKS.  
18890 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
188a0 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
188b0 65 78 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  ex.#endif.  ){. 
188c0 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73     db->mutex = s
188d0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
188e0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
188f0 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66  CURSIVE);.    if
18900 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  ( db->mutex==0 )
18910 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
18920 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20  free(db);.      
18930 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  db = 0;.      go
18940 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
18950 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 54     }.    if( isT
18960 68 72 65 61 64 73 61 66 65 3d 3d 30 20 29 7b 0a  hreadsafe==0 ){.
18970 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74        sqlite3Mut
18980 65 78 57 61 72 6e 4f 6e 43 6f 6e 74 65 6e 74 69  exWarnOnContenti
18990 6f 6e 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  on(db->mutex);. 
189a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
189b0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
189c0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
189d0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b  >errMask = 0xff;
189e0 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
189f0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
18a00 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
18a10 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
18a20 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 64 62  >aDbStatic;.  db
18a30 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
18a40 61 62 6c 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73  able = 1;..  ass
18a50 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
18a60 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
18a70 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
18a80 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
18a90 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
18aa0 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
18ab0 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69  t));.  db->aLimi
18ac0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
18ad0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d  ORKER_THREADS] =
18ae0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18af0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a  WORKER_THREADS;.
18b00 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
18b10 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
18b20 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
18b30 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c  db->szMmap = sql
18b40 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18b50 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e  .szMmap;.  db->n
18b60 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
18b70 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65  .  db->nMaxSorte
18b80 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46  rMmap = 0x7FFFFF
18b90 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  FF;.  db->flags 
18ba0 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
18bb0 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
18bc0 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c  _EnableTrigger |
18bd0 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
18be0 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ll.#if !defined(
18bf0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
18c00 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20  UTOMATIC_INDEX) 
18c10 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  || SQLITE_DEFAUL
18c20 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
18c30 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X.              
18c40 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f     | SQLITE_Auto
18c50 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66  Index.#endif.#if
18c60 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18c70 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20  CKPTFULLFSYNC.  
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c90 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c   SQLITE_CkptFull
18ca0 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66  FSync.#endif.#if
18cb0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18cc0 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20  FILE_FORMAT<4.  
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18ce0 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
18cf0 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66  leFmt.#endif.#if
18d00 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18d10 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
18d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d30 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45    | SQLITE_LoadE
18d40 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a  xtension.#endif.
18d50 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
18d60 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49  LT_RECURSIVE_TRI
18d70 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20  GGERS.          
18d80 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
18d90 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64  RecTriggers.#end
18da0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
18db0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
18dc0 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53  REIGN_KEYS) && S
18dd0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
18de0 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20  REIGN_KEYS.     
18df0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
18e00 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
18e10 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
18e20 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52  ned(SQLITE_REVER
18e30 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c  SE_UNORDERED_SEL
18e40 45 43 54 53 29 0a 20 20 20 20 20 20 20 20 20 20  ECTS).          
18e50 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
18e60 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e  ReverseOrder.#en
18e70 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
18e80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
18e90 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
18ea0 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K).             
18eb0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c      | SQLITE_Cel
18ec0 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 23  lSizeCk.#endif.#
18ed0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
18ee0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  E_ENABLE_FTS3_TO
18ef0 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20 20 20 20  KENIZER).       
18f00 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
18f10 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
18f20 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
18f30 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
18f40 45 5f 51 50 53 47 29 0a 20 20 20 20 20 20 20 20  E_QPSG).        
18f50 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
18f60 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a 23 65 6e  E_EnableQPSG.#en
18f70 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
18f80 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
18f90 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
18fa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18fb0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
18fc0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
18fd0 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
18fe0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
18ff0 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
19000 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19010 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77  BINARY. BINARY w
19020 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54  orks for both UT
19030 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46  F-8.  ** and UTF
19040 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65  -16, so add a ve
19050 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  rsion for each t
19060 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65  o avoid any unne
19070 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e  cessary.  ** con
19080 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  versions. The on
19090 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61  ly error that ca
190a0 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20  n occur here is 
190b0 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
190c0 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56  re..  **.  ** EV
190d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37  IDENCE-OF: R-527
190e0 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20  86-44878 SQLite 
190f0 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75  defines three bu
19100 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
19110 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  .  ** functions:
19120 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
19130 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
19140 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
19150 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
19160 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
19170 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
19180 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
19190 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
191a0 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
191b0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
191c0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
191d0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
191e0 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  Y, SQLITE_UTF16L
191f0 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
19200 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
19210 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
19220 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
19230 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
19240 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
19250 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
19260 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
19270 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
19280 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
19290 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
192a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
192b0 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
192c0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45  _out;.  }.  /* E
192d0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
192e0 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65  308-17224 The de
192f0 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
19300 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  function for all
19310 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73  .  ** strings is
19320 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20   BINARY. .  */. 
19330 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
19340 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
19350 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
19360 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42  TF8, sqlite3StrB
19370 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73  INARY, 0);.  ass
19380 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
19390 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50  ll!=0 );..  /* P
193a0 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
193b0 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 0a 20  e/URI argument. 
193c0 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20 61 6c   **.  ** Only al
193d0 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d  low sensible com
193e0 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74  binations of bit
193f0 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61  s in the flags a
19400 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20  rgument.  .  ** 
19410 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
19420 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20  f any non-sense 
19430 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75  combination is u
19440 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  sed.  If we.  **
19450 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c   do not block il
19460 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f  legal combinatio
19470 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c  ns here, it coul
19480 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61  d trigger.  ** a
19490 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
194a0 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79  ts in deeper lay
194b0 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63  ers.  Sensible c
194c0 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a  ombinations.  **
194d0 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   are:.  **.  ** 
194e0 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   1:  SQLITE_OPEN
194f0 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20  _READONLY.  **  
19500 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  2:  SQLITE_OPEN_
19510 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20  READWRITE.  **  
19520 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  6:  SQLITE_OPEN_
19530 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
19540 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20  TE_OPEN_CREATE. 
19550 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
19560 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 61  ags = flags;.  a
19570 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
19580 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20  EN_READONLY  == 
19590 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0x01 );.  assert
195a0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
195b0 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20  ADWRITE == 0x02 
195c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
195d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
195e0 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20     == 0x04 );.  
195f0 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
19600 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29  lags&7))==0x02 )
19610 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f  ; /* READONLY */
19620 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
19630 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
19640 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  4 ); /* READWRIT
19650 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  E */.  testcase(
19660 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
19670 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44  =0x40 ); /* READ
19680 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a  WRITE | CREATE *
19690 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c  /.  if( ((1<<(fl
196a0 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d  ags&7)) & 0x46)=
196b0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
196c0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
196d0 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35  T;  /* IMP: R-65
196e0 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d  497-44594 */.  }
196f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
19700 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a  qlite3ParseUri(z
19710 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
19720 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66  &flags, &db->pVf
19730 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72  s, &zOpen, &zErr
19740 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Msg);.  }.  if( 
19750 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19760 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19770 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69  ITE_NOMEM ) sqli
19780 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
19790 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
197a0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
197b0 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
197c0 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
197d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
197e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
197f0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
19800 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
19810 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
19820 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
19830 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
19840 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
19850 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
19860 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
19890 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
198a0 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
198b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
198c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
198d0 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
198e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
198f0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
19900 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
19910 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67  r(db, rc);.    g
19920 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
19930 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
19940 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b  eeEnter(db->aDb[
19950 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
19960 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
19970 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
19980 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
19990 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  pBt);.  if( !db-
199a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
199b0 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41  ENC(db) = SCHEMA
199c0 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69  _ENC(db);.  sqli
199d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 64 62  te3BtreeLeave(db
199e0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
199f0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
19a00 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
19a10 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a  emaGet(db, 0);..
19a20 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
19a30 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
19a40 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
19a50 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72  ase is FULL; for
19a60 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64   the temp.  ** d
19a70 61 74 61 62 61 73 65 20 69 74 20 69 73 20 4f 46  atabase it is OF
19a80 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  F. This matches 
19a90 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
19aa0 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
19ab0 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44  .  db->aDb[0].zD
19ac0 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  bSName = "main";
19ad0 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61  .  db->aDb[0].sa
19ae0 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c  fety_level = SQL
19af0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
19b00 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64 62 2d  HRONOUS+1;.  db-
19b10 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
19b20 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
19b30 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
19b40 65 76 65 6c 20 3d 20 50 41 47 45 52 5f 53 59 4e  evel = PAGER_SYN
19b50 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20  CHRONOUS_OFF;.. 
19b60 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
19b70 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
19b80 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19b90 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
19ba0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
19bb0 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
19bc0 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66  r all built-in f
19bd0 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f  unctions, but do
19be0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
19bf0 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61  read the.  ** da
19c00 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65  tabase schema ye
19c10 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79  t. This is delay
19c20 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ed until the fir
19c30 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  st time the data
19c40 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63  base.  ** is acc
19c50 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  essed..  */.  sq
19c60 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
19c70 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
19c80 69 74 65 33 52 65 67 69 73 74 65 72 50 65 72 43  ite3RegisterPerC
19c90 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69 6e  onnectionBuiltin
19ca0 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20  Functions(db);. 
19cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
19cc0 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23 69 66 64  rcode(db);..#ifd
19cd0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19ce0 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65 67 69 73  _FTS5.  /* Regis
19cf0 74 65 72 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e  ter any built-in
19d00 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 62 65 66   FTS5 module bef
19d10 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  ore loading the 
19d20 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a 2a 20 65  automatic.  ** e
19d30 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68 69 73 20  xtensions. This 
19d40 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61 74 69 63  allows automatic
19d50 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f 20 72   extensions to r
19d60 65 67 69 73 74 65 72 20 46 54 53 35 20 0a 20 20  egister FTS5 .  
19d70 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73 20 61 6e  ** tokenizers an
19d80 64 20 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63  d auxiliary func
19d90 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69 66 28  tions.  */.  if(
19da0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
19db0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
19dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
19dd0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28  sqlite3Fts5Init(
19de0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
19df0 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
19e00 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
19e10 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
19e20 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
19e30 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
19e40 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
19e50 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
19e60 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
19e70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19e80 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
19e90 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  AutoLoadExtensio
19ea0 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ns(db);.    rc =
19eb0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
19ec0 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
19ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19ee0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
19ef0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
19f00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19f10 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28  NABLE_FTS1.  if(
19f20 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
19f30 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  ed ){.    extern
19f40 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31   int sqlite3Fts1
19f50 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
19f60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19f70 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts1Init(db);.  
19f80 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
19f90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
19fa0 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS2.  if( !db->m
19fb0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
19fc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19fd0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
19fe0 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73  qlite3Fts2Init(s
19ff0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
1a000 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e   = sqlite3Fts2In
1a010 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
1a020 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1a030 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a  E_ENABLE_FTS3 /*
1a040 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
1a050 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45  efined by SQLITE
1a060 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a  _ENABLE_FTS4 */.
1a070 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a080 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a0a0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
1a0b0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1a0c0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1a0d0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1a0e0 49 43 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ICU) || defined(
1a0f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
1a100 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 20 20  U_COLLATIONS).  
1a110 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1a120 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
1a130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a140 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69   = sqlite3IcuIni
1a150 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
1a160 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1a170 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20  _ENABLE_RTREE.  
1a180 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1a190 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
1a1a0 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
1a1b0 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  = sqlite3RtreeIn
1a1c0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
1a1d0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1a1e0 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f  E_ENABLE_DBPAGE_
1a1f0 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e  VTAB.  if( !db->
1a200 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
1a210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
1a220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a230 44 62 70 61 67 65 52 65 67 69 73 74 65 72 28 64  DbpageRegister(d
1a240 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1a250 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a260 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42  ABLE_DBSTAT_VTAB
1a270 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
1a280 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
1a290 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
1a2a0 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74  rc = sqlite3Dbst
1a2b0 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a  atRegister(db);.
1a2c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1a2d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a2e0 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64 62  _JSON1.  if( !db
1a2f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
1a300 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
1a310 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1a320 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b  e3Json1Init(db);
1a330 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1a340 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a350 45 5f 53 54 4d 54 56 54 41 42 0a 20 20 69 66 28  E_STMTVTAB.  if(
1a360 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1a370 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
1a380 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
1a390 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
1a3a0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
1a3b0 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  if..  /* -DSQLIT
1a3c0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
1a3d0 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
1a3e0 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
1a3f0 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
1a400 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
1a410 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
1a420 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
1a430 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
1a440 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
1a450 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
1a460 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
1a470 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
1a480 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
1a490 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
1a4a0 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
1a4b0 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
1a4c0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
1a4d0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
1a4e0 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
1a4f0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
1a500 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
1a510 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1a540 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
1a550 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
1a560 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74    if( rc ) sqlit
1a570 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
1a580 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68  ..  /* Enable th
1a590 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c  e lookaside-mall
1a5a0 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a  oc subsystem */.
1a5b0 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65    setupLookaside
1a5c0 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47  (db, 0, sqlite3G
1a5d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
1a5e0 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20  okaside,.       
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a610 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29  nfig.nLookaside)
1a620 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  ;..  sqlite3_wal
1a630 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
1a640 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  db, SQLITE_DEFAU
1a650 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  LT_WAL_AUTOCHECK
1a660 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f  POINT);..opendb_
1a670 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b  out:.  if( db ){
1a680 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1a690 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54  >mutex!=0 || isT
1a6a0 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20 20  hreadsafe==0.   
1a6b0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
1a6c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1a6d0 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  FullMutex==0 );.
1a6e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a6f0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1a700 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  x);.  }.  rc = s
1a710 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
1a720 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
1a730 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
1a740 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28  E_NOMEM );.  if(
1a750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
1a760 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
1a770 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
1a780 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  db = 0;.  }else 
1a790 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a7a0 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  K ){.    db->mag
1a7b0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1a7c0 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70  C_SICK;.  }.  *p
1a7d0 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66  pDb = db;.#ifdef
1a7e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1a7f0 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
1a800 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1a810 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
1a820 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68  * Opening a db h
1a830 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
1a840 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
1a850 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  d 0. */.    void
1a860 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33   *pArg = sqlite3
1a870 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
1a880 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c  llogArg;.    sql
1a890 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a8a0 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64  .xSqllog(pArg, d
1a8b0 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  b, zFilename, 0)
1a8c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
1a8d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a8e0 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69 66 28  HAS_CODEC).  if(
1a8f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a900 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1a910 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69 66 28 20   *zKey;.    if( 
1a920 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
1a930 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f  uri_parameter(zO
1a940 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29 29 21  pen, "hexkey"))!
1a950 3d 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20 29 7b  =0 && zKey[0] ){
1a960 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65 3b  .      u8 iByte;
1a970 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1a980 20 20 20 20 63 68 61 72 20 7a 44 65 63 6f 64 65      char zDecode
1a990 64 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72  d[40];.      for
1a9a0 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69  (i=0, iByte=0; i
1a9b0 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64 65 64  <sizeof(zDecoded
1a9c0 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73  )*2 && sqlite3Is
1a9d0 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d 29 3b  xdigit(zKey[i]);
1a9e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1a9f0 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34  Byte = (iByte<<4
1aa00 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f  ) + sqlite3HexTo
1aa10 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20 20  Int(zKey[i]);.  
1aa20 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21        if( (i&1)!
1aa30 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b 69 2f  =0 ) zDecoded[i/
1aa40 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20  2] = iByte;.    
1aa50 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1aa60 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20  3_key_v2(db, 0, 
1aa70 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32 29 3b 0a  zDecoded, i/2);.
1aa80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a      }else if( (z
1aa90 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  Key = sqlite3_ur
1aaa0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65  i_parameter(zOpe
1aab0 6e 2c 20 22 6b 65 79 22 29 29 21 3d 30 20 29 7b  n, "key"))!=0 ){
1aac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  .      sqlite3_k
1aad0 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a 4b 65  ey_v2(db, 0, zKe
1aae0 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  y, sqlite3Strlen
1aaf0 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20 20 7d  30(zKey));.    }
1ab00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
1ab10 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e  lite3_free(zOpen
1ab20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26  );.  return rc &
1ab30 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
1ab40 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
1ab50 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
1ab60 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  nt sqlite3_open(
1ab70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ab80 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
1ab90 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a  ite3 **ppDb .){.
1aba0 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
1abb0 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  abase(zFilename,
1abc0 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1abe0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1abf0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1ac00 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69  _CREATE, 0);.}.i
1ac10 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
1ac20 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v2(.  const char
1ac30 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a   *filename,   /*
1ac40 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
1ac50 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  me (UTF-8) */.  
1ac60 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
1ac70 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1ac80 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65  SQLite db handle
1ac90 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1acb0 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   Flags */.  cons
1acc0 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
1acd0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
1ace0 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65  FS module to use
1acf0 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1ad00 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c  openDatabase(fil
1ad10 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e  ename, ppDb, (un
1ad20 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73  signed int)flags
1ad30 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
1ad40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ad50 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
1ad60 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
1ad70 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
1ad80 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
1ad90 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1ada0 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
1adb0 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
1adc0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
1add0 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
1ade0 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
1adf0 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
1ae00 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
1ae10 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
1ae20 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  l;.  int rc;..#i
1ae30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ae40 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1ae50 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74  f( ppDb==0 ) ret
1ae60 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1ae70 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1ae80 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
1ae90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1aea0 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
1aeb0 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1aec0 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
1aed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
1aee0 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  if.  if( zFilena
1aef0 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d  me==0 ) zFilenam
1af00 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a  e = "\000\000";.
1af10 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
1af20 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
1af30 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
1af40 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c  r(pVal, -1, zFil
1af50 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  ename, SQLITE_UT
1af60 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54  F16NATIVE, SQLIT
1af70 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69  E_STATIC);.  zFi
1af80 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65  lename8 = sqlite
1af90 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
1afa0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1afb0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20   if( zFilename8 
1afc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
1afd0 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
1afe0 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  me8, ppDb,.     
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b000 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1b010 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1b020 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
1b030 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
1b040 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  Db || rc==SQLITE
1b050 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66  _NOMEM );.    if
1b060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b070 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
1b080 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53  y(*ppDb, 0, DB_S
1b090 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
1b0a0 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43        SCHEMA_ENC
1b0b0 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a 70  (*ppDb) = ENC(*p
1b0c0 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
1b0d0 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
1b0e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1b0f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1b100 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
1b110 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
1b120 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  l);..  return rc
1b130 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69   & 0xff;.}.#endi
1b140 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b150 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
1b160 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1b170 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b180 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1b190 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1b1a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1b1b0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1b1c0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1b1d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b1e0 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1b1f0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1b200 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1b210 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1b220 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1b230 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65  t void*).){.  re
1b240 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
1b250 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
1b260 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c  (db, zName, enc,
1b270 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
1b280 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
1b290 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
1b2a0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b2b0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1b2c0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
1b2d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
1b2e0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
1b2f0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
1b300 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b310 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
1b320 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1b330 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1b340 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1b350 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1b360 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
1b370 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
1b380 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
1b390 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1b3a0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1b3b0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1b3c0 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1b3d0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
1b3e0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1b3f0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1b400 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b410 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1b420 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
1b430 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
1b440 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
1b450 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
1b460 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
1b470 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
1b480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1b490 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1b4a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1b4b0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1b4c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b4d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b4e0 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1b4f0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
1b500 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1b510 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
1b520 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
1b530 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
1b540 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
1b550 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1b560 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
1b570 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
1b580 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
1b590 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
1b5a0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
1b5b0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
1b5c0 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
1b5d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b5e0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
1b5f0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1b600 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1b610 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1b620 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1b630 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
1b640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1b650 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1b660 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1b670 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1b680 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
1b690 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b6a0 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
1b6b0 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
1b6c0 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
1b6d0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
1b6e0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
1b6f0 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
1b700 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
1b710 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
1b720 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
1b730 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
1b740 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
1b750 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
1b760 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
1b770 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
1b780 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1b790 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1b7a0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1b7b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1b7c0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
1b7d0 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
1b7e0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
1b7f0 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
1b800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1b810 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
1b820 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
1b830 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
1b840 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b850 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
1b860 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
1b870 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
1b880 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
1b890 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
1b8a0 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
1b8b0 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
1b8c0 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1b8d0 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
1b8e0 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1b8f0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1b900 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1b910 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1b920 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1b930 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1b940 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1b950 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1b960 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1b970 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
1b980 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
1b990 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1b9a0 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
1b9b0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
1b9c0 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
1b9d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b9e0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1b9f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ba00 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ba10 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
1ba20 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
1ba30 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1ba40 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
1ba50 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
1ba60 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
1ba70 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
1ba80 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
1ba90 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1baa0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1bab0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1bac0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
1bad0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1bae0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
1baf0 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
1bb00 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
1bb10 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
1bb20 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
1bb30 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69  nst void*).){.#i
1bb40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1bb50 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1bb60 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1bb70 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1bb80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1bb90 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1bba0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1bbb0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1bbc0 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
1bbd0 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
1bbe0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
1bbf0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
1bc00 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
1bc10 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
1bc20 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
1bc30 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1bc40 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1bc50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1bc60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1bc70 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
1bc80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bc90 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
1bca0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1bcb0 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
1bcc0 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
1bcd0 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
1bce0 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
1bcf0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1bd00 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
1bd10 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
1bd20 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
1bd30 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
1bd40 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
1bd50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bd60 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
1bd70 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
1bd80 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1bd90 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1bda0 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
1bdb0 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
1bdc0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1bdd0 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
1bde0 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
1bdf0 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
1be00 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
1be10 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
1be20 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
1be30 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
1be40 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
1be50 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
1be60 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69  r ROLLBACK..*/.i
1be70 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
1be80 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
1be90 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
1bea0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1beb0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1bec0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1bed0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1bee0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1bef0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1bf00 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
1bf10 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
1bf20 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  toCommit;.}../*.
1bf30 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1bf40 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75   routines are su
1bf50 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f  bstitutes for co
1bf60 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43  nstants SQLITE_C
1bf70 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54  ORRUPT,.** SQLIT
1bf80 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45  E_MISUSE, SQLITE
1bf90 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54  _CANTOPEN, SQLIT
1bfa0 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73 73  E_NOMEM and poss
1bfb0 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72  ibly other error
1bfc0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20  .** constants.  
1bfd0 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70  They serve two p
1bfe0 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  urposes:.**.**  
1bff0 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20   1.  Serve as a 
1c000 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
1c010 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
1c020 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67  oint in a debugg
1c030 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64  er.**       to d
1c040 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69  etect when versi
1c050 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  on error conditi
1c060 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ons occurs..**.*
1c070 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73  *   2.  Invoke s
1c080 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20  qlite3_log() to 
1c090 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72  provide the sour
1c0a0 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e  ce code location
1c0b0 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20   where.**       
1c0c0 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  a low-level erro
1c0d0 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  r is first detec
1c0e0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1c0f0 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 69  te3ReportError(i
1c100 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69 6e  nt iErr, int lin
1c110 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  eno, const char 
1c120 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  *zType){.  sqlit
1c130 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25 73  e3_log(iErr, "%s
1c140 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
1c150 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
1c160 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c 69         zType, li
1c170 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
1c180 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
1c190 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a 69  return iErr;.}.i
1c1a0 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
1c1b0 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  tError(int linen
1c1c0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1c1d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c1e0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1c1f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1c200 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1c210 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e  E_CORRUPT, linen
1c220 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f 72  o, "database cor
1c230 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e 74  ruption");.}.int
1c240 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
1c250 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1c260 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1c270 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1c280 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1c290 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1c2a0 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4d  rtError(SQLITE_M
1c2b0 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20 22  ISUSE, lineno, "
1c2c0 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74 20  misuse");.}.int 
1c2d0 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
1c2e0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1c2f0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1c300 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1c310 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1c320 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1c330 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1c340 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f  CANTOPEN, lineno
1c350 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66  , "cannot open f
1c360 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66 20  ile");.}.#ifdef 
1c370 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
1c380 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 50   sqlite3CorruptP
1c390 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  gnoError(int lin
1c3a0 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  eno, Pgno pgno){
1c3b0 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31 30 30  .  char zMsg[100
1c3c0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
1c3d0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4d 73  rintf(sizeof(zMs
1c3e0 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74 61 62  g), zMsg, "datab
1c3f0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 70  ase corruption p
1c400 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29 3b 0a  age %d", pgno);.
1c410 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1c420 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c430 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1c440 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1c450 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f  tError(SQLITE_CO
1c460 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a  RRUPT, lineno, z
1c470 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Msg);.}.int sqli
1c480 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e  te3NomemError(in
1c490 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1c4a0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1c4b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1c4c0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
1c4d0 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1c4e0 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  r(SQLITE_NOMEM, 
1c4f0 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a  lineno, "OOM");.
1c500 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f 65  }.int sqlite3Ioe
1c510 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74  rrnomemError(int
1c520 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1c530 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1c540 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1c550 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
1c560 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1c570 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  (SQLITE_IOERR_NO
1c580 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f  MEM, lineno, "I/
1c590 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a 7d  O OOM error");.}
1c5a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1c5b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
1c5c0 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
1c5d0 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65  is is a convenie
1c5e0 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74  nce routine that
1c5f0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
1c600 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63   all thread-spec
1c610 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72  ific.** data for
1c620 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73   this thread has
1c630 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   been deallocate
1c640 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  d..**.** SQLite 
1c650 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74  no longer uses t
1c660 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64  hread-specific d
1c670 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ata so this rout
1c680 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20  ine is now a.** 
1c690 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65  no-op.  It is re
1c6a0 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f  tained for histo
1c6b0 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c  rical compatibil
1c6c0 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
1c6d0 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
1c6e0 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e  nup(void){.}.#en
1c6f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
1c700 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  n meta informati
1c710 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69  on about a speci
1c720 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  fic column of a 
1c730 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
1c740 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69  ** See comment i
1c750 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c  n sqlite3.h (sql
1c760 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65  ite.h.in) for de
1c770 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tails..*/.int sq
1c780 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
1c790 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73  mn_metadata(.  s
1c7a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1c7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1c7c0 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
1c7d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c7e0 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20  *zDbName,       
1c7f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
1c800 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  e or NULL */.  c
1c810 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
1c820 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61  eName,     /* Ta
1c830 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ble name */.  co
1c840 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1c850 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c  nName,    /* Col
1c860 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
1c870 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74  ar const **pzDat
1c880 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54  aType,    /* OUT
1c890 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61  PUT: Declared da
1c8a0 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  ta type */.  cha
1c8b0 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c  r const **pzColl
1c8c0 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50  Seq,     /* OUTP
1c8d0 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  UT: Collation se
1c8e0 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20  quence name */. 
1c8f0 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20   int *pNotNull, 
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c910 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
1c920 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
1c930 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  int exists */.  
1c940 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  int *pPrimaryKey
1c950 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
1c960 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
1c970 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b  olumn part of PK
1c980 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f   */.  int *pAuto
1c990 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  inc             
1c9a0 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1c9b0 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61  e if column is a
1c9c0 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f  uto-increment */
1c9d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1c9e0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
1c9f0 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
1ca00 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
1ca10 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
1ca20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72  iCol = 0;.  char
1ca30 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
1ca40 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
1ca50 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
1ca60 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
1ca70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
1ca80 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
1ca90 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
1caa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1cab0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1cac0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1cad0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1cae0 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30  || zTableName==0
1caf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1cb00 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1cb10 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1cb20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
1cb30 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
1cb40 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
1cb50 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1cb60 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1cb70 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
1cb80 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
1cb90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
1cba0 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29  it(db, &zErrMsg)
1cbb0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1cbc0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  K!=rc ){.    got
1cbd0 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1cbe0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
1cbf0 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74  e table in quest
1cc00 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  ion */.  pTab = 
1cc10 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1cc20 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
1cc30 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1cc40 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e   !pTab || pTab->
1cc50 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
1cc60 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  Tab = 0;.    got
1cc70 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
1cc80 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
1cc90 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68  column for which
1cca0 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74   info is request
1ccb0 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c  ed */.  if( zCol
1ccc0 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  umnName==0 ){.  
1ccd0 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 65    /* Query for e
1cce0 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62 6c  xistance of tabl
1ccf0 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73  e only */.  }els
1cd00 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  e{.    for(iCol=
1cd10 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
1cd20 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
1cd30 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
1cd40 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
1cd50 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
1cd60 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
1cd70 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d  Name, zColumnNam
1cd80 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
1cd90 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1cda0 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
1cdb0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
1cdc0 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
1cdd0 64 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  d(pTab) && sqlit
1cde0 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d  e3IsRowid(zColum
1cdf0 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
1ce00 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
1ce10 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  PKey;.        pC
1ce20 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26  ol = iCol>=0 ? &
1ce30 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
1ce40 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   : 0;.      }els
1ce50 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  e{.        pTab 
1ce60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
1ce70 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1ce80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1ce90 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1cea0 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20  ng block stores 
1ceb0 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  the meta informa
1cec0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62  tion that will b
1ced0 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  e returned.  ** 
1cee0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  to the caller in
1cef0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
1cf00 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c   zDataType, zCol
1cf10 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70  lSeq, notnull, p
1cf20 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61  rimarykey.  ** a
1cf30 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74  nd autoinc. At t
1cf40 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1cf50 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c  are two possibil
1cf60 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a  ities:.  ** .  *
1cf70 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65  *     1. The spe
1cf80 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  cified column na
1cf90 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22  me was rowid", "
1cfa0 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f  oid" or "_rowid_
1cfb0 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61  " .  **        a
1cfc0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65  nd there is no e
1cfd0 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
1cfe0 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a  ed IPK column. .
1cff0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e    **.  **     2.
1d000 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   The table is no
1d010 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  t a view and the
1d020 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65   column name ide
1d030 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a  ntified an .  **
1d040 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74          explicit
1d050 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
1d060 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e  mn. Copy meta in
1d070 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a  formation from *
1d080 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  pCol..  */ .  if
1d090 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44  ( pCol ){.    zD
1d0a0 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ataType = sqlite
1d0b0 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c  3ColumnType(pCol
1d0c0 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  ,0);.    zCollSe
1d0d0 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b  q = pCol->zColl;
1d0e0 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70  .    notnull = p
1d0f0 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b  Col->notNull!=0;
1d100 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
1d110 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61   = (pCol->colFla
1d120 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
1d130 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75  MKEY)!=0;.    au
1d140 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50  toinc = pTab->iP
1d150 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54  Key==iCol && (pT
1d160 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1d170 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
1d180 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
1d190 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
1d1a0 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
1d1b0 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
1d1c0 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
1d1d0 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
1d1e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1d1f0 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f  ARY;.  }..error_
1d200 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74  out:.  sqlite3Bt
1d210 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
1d220 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74  ..  /* Whether t
1d230 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
1d240 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61   succeeded or fa
1d250 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75  iled, set the ou
1d260 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a  tput parameters.
1d270 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72    ** to whatever
1d280 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75   their local cou
1d290 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69  nterparts contai
1d2a0 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  n. If an error d
1d2b0 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74  id occur,.  ** t
1d2c0 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65  his has the effe
1d2d0 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c  ct of zeroing al
1d2e0 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  l output paramet
1d2f0 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
1d300 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a  pzDataType ) *pz
1d310 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61  DataType = zData
1d320 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f  Type;.  if( pzCo
1d330 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53  llSeq ) *pzCollS
1d340 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20  eq = zCollSeq;. 
1d350 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20   if( pNotNull ) 
1d360 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e  *pNotNull = notn
1d370 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d  ull;.  if( pPrim
1d380 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61  aryKey ) *pPrima
1d390 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b  ryKey = primaryk
1d3a0 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69  ey;.  if( pAutoi
1d3b0 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d  nc ) *pAutoinc =
1d3c0 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28   autoinc;..  if(
1d3d0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26   SQLITE_OK==rc &
1d3e0 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73  & !pTab ){.    s
1d3f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d400 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a   zErrMsg);.    z
1d410 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
1d420 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20  MPrintf(db, "no 
1d430 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d  such table colum
1d440 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c  n: %s.%s", zTabl
1d450 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a  eName,.        z
1d460 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20  ColumnName);.   
1d470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1d480 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
1d490 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
1d4a0 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
1d4b0 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
1d4c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d4d0 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
1d4e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
1d4f0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
1d500 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d510 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1d520 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d530 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
1d540 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
1d550 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
1d560 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
1d570 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1d580 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b  3_sleep(int ms){
1d590 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1d5a0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
1d5b0 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
1d5c0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1d5d0 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65  if( pVfs==0 ) re
1d5e0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  turn 0;..  /* Th
1d5f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
1d600 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s in millisecond
1d610 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72  s, but the under
1d620 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20  lying OsSleep() 
1d630 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d  .  ** API uses m
1d640 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e  icroseconds. Hen
1d650 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20  ce the 1000's.. 
1d660 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69   */.  rc = (sqli
1d670 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c  te3OsSleep(pVfs,
1d680 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b   1000*ms)/1000);
1d690 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d6a0 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  ./*.** Enable or
1d6b0 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74   disable the ext
1d6c0 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64  ended result cod
1d6d0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1d6e0 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
1d6f0 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33  lt_codes(sqlite3
1d700 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29   *db, int onoff)
1d710 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1d720 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1d730 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1d740 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1d750 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1d760 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1d770 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1d780 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1d790 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
1d7a0 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
1d7b0 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
1d7c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1d7d0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1d7e0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1d7f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d800 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
1d810 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
1d820 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
1d830 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
1d840 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1d850 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
1d860 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1d870 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
1d880 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
1d890 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
1d8a0 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
1d8b0 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53  Btree;..#ifdef S
1d8c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1d8d0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1d8e0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1d8f0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1d900 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1d910 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1d920 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1d930 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
1d940 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  Btree = sqlite3D
1d950 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1d960 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1d970 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50   pBtree ){.    P
1d980 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
1d990 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1d9a0 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  fd;.    sqlite3B
1d9b0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1d9c0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
1d9d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
1d9e0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61  r(pBtree);.    a
1d9f0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1da00 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c   );.    fd = sql
1da10 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
1da20 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
1da30 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
1da40 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1da50 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
1da60 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1da70 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
1da80 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20   = fd;.      rc 
1da90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1daa0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53   }else if( op==S
1dab0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f  QLITE_FCNTL_VFS_
1dac0 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1dad0 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a   *(sqlite3_vfs**
1dae0 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50  )pArg = sqlite3P
1daf0 61 67 65 72 56 66 73 28 70 50 61 67 65 72 29 3b  agerVfs(pPager);
1db00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1db10 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1db20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1db30 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f  FCNTL_JOURNAL_PO
1db40 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1db50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29  (sqlite3_file**)
1db60 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1db70 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67  gerJrnlFile(pPag
1db80 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1db90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1dba0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1dbb0 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56  ITE_FCNTL_DATA_V
1dbc0 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
1dbd0 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29  *(unsigned int*)
1dbe0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1dbf0 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 70  gerDataVersion(p
1dc00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1dc10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1dc20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1dc30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1dc40 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
1dc50 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pArg);.    }.  
1dc60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1dc70 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1dc80 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1dc90 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1dca0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1dcb0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
1dcc0 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
1dcd0 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
1dce0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1dcf0 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
1dd00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1dd10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
1dd20 4e 54 45 53 54 41 42 4c 45 0a 20 20 55 4e 55 53  NTESTABLE.  UNUS
1dd30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29  ED_PARAMETER(op)
1dd40 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73  ;.#else.  va_lis
1dd50 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
1dd60 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
1dd70 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
1dd80 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68  *.    ** Save th
1dd90 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1dda0 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20  of the PRNG..   
1ddb0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ddc0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1ddd0 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20  G_SAVE: {.      
1dde0 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53  sqlite3PrngSaveS
1ddf0 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
1de00 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1de10 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72  /*.    ** Restor
1de20 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
1de30 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c  he PRNG to the l
1de40 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20  ast state saved 
1de50 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e  using.    ** PRN
1de60 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47  G_SAVE.  If PRNG
1de70 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20  _SAVE has never 
1de80 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c  before been call
1de90 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
1dea0 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c  this verb acts l
1deb0 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a  ike PRNG_RESET..
1dec0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ded0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1dee0 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  PRNG_RESTORE: {.
1def0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1df00 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b  gRestoreState();
1df10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1df20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1df30 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e  ** Reset the PRN
1df40 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e  G back to its un
1df50 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74  initialized stat
1df60 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c  e.  The next cal
1df70 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
1df80 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29  te3_randomness()
1df90 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65   will reseed the
1dfa0 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69   PRNG using a si
1dfb0 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  ngle call.    **
1dfc0 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e   to the xRandomn
1dfd0 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  ess method of th
1dfe0 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20  e default VFS.. 
1dff0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e000 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1e010 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20  RNG_RESET: {.   
1e020 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
1e030 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20  mness(0,0);.    
1e040 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1e050 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1e060 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1e070 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c  rol(BITVEC_TEST,
1e080 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a   size, program).
1e090 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75      **.    ** Ru
1e0a0 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74  n a test against
1e0b0 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74   a Bitvec object
1e0c0 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70   of size.  The p
1e0d0 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a  rogram argument.
1e0e0 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72      ** is an arr
1e0f0 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74  ay of integers t
1e100 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1e110 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31  test.  Return -1
1e120 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d   on a.    ** mem
1e130 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
1e140 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65  rror, 0 on succe
1e150 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  ss, or non-zero 
1e160 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  for an error..  
1e170 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c    ** See the sql
1e180 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
1e190 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69  nTest() for addi
1e1a0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1e1b0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  on..    */.    c
1e1c0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e1d0 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a  TRL_BITVEC_TEST:
1e1e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20   {.      int sz 
1e1f0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1e200 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50  );.      int *aP
1e210 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  rog = va_arg(ap,
1e220 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63   int*);.      rc
1e230 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1e240 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20  BuiltinTest(sz, 
1e250 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72  aProg);.      br
1e260 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1e270 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1e280 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e290 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78  FAULT_INSTALL, x
1e2a0 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a  Callback).    **
1e2b0 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20  .    ** Arrange 
1e2c0 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62  to invoke xCallb
1e2d0 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73  ack() whenever s
1e2e0 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29  qlite3FaultSim()
1e2f0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20   is called,.    
1e300 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20  ** if xCallback 
1e310 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
1e320 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20   **.    ** As a 
1e330 74 65 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c  test of the faul
1e340 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68  t simulator mech
1e350 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71  anism itself, sq
1e360 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
1e370 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  .    ** is calle
1e380 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
1e390 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74  ter installing t
1e3a0 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20  he new callback 
1e3b0 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20  and the return. 
1e3c0 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d     ** value from
1e3d0 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1e3e0 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  (0) becomes the 
1e3f0 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20  return from.    
1e400 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
1e410 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a  control()..    *
1e420 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e430 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54  E_TESTCTRL_FAULT
1e440 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20  _INSTALL: {.    
1e450 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
1e460 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
1e470 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
1e480 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
1e490 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
1e4a0 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
1e4b0 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
1e4c0 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
1e4d0 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62  onfig.xTestCallb
1e4e0 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ack = va_arg(ap,
1e4f0 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20   int(*)(int));. 
1e500 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79       */.      ty
1e510 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43  pedef int(*TESTC
1e520 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69  ALLBACKFUNC_t)(i
1e530 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1e540 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1e550 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76  TestCallback = v
1e560 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43 41  a_arg(ap, TESTCA
1e570 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20  LLBACKFUNC_t);. 
1e580 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e590 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20  3FaultSim(0);.  
1e5a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e5b0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1e5c0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e5d0 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c  ntrol(BENIGN_MAL
1e5e0 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69  LOC_HOOKS, xBegi
1e5f0 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a  n, xEnd).    **.
1e600 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20      ** Register 
1e610 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f  hooks to call to
1e620 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20   indicate which 
1e630 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1e640 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65  s .    ** are be
1e650 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nign..    */.   
1e660 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e670 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
1e680 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20  LOC_HOOKS: {.   
1e690 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
1e6a0 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  (*void_function)
1e6b0 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f  (void);.      vo
1e6c0 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
1e6d0 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ignBegin;.      
1e6e0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1e6f0 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20  enignEnd;.      
1e700 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76  xBenignBegin = v
1e710 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1e720 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1e730 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f  xBenignEnd = va_
1e740 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
1e750 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  ction);.      sq
1e760 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f  lite3BenignMallo
1e770 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65  cHooks(xBenignBe
1e780 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29  gin, xBenignEnd)
1e790 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e7a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1e7b0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1e7c0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1e7d0 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
1e7e0 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64  G_BYTE, unsigned
1e7f0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
1e800 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45     ** Set the PE
1e810 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68  NDING byte to th
1e820 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  e value in the a
1e830 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e  rgument, if X>0.
1e840 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20  .    ** Make no 
1e850 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e  changes if X==0.
1e860 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c    Return the val
1e870 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ue of the pendin
1e880 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73  g byte.    ** as
1e890 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66   it existing bef
1e8a0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1e8b0 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
1e8c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52   **.    ** IMPOR
1e8d0 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20  TANT:  Changing 
1e8e0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1e8f0 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30   from 0x40000000
1e900 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20   results in.    
1e910 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ** an incompatib
1e920 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  le database file
1e930 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69   format.  Changi
1e940 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
1e950 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  yte.    ** while
1e960 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f   any database co
1e970 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
1e980 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65   results in unde
1e990 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  fined and.    **
1e9a0 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68   deleterious beh
1e9b0 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  avior..    */.  
1e9c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e9d0 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
1e9e0 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  YTE: {.      rc 
1e9f0 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
1ea00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ea10 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a  MIT_WSD.      {.
1ea20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1ea30 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61   int newVal = va
1ea40 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65  _arg(ap, unsigne
1ea50 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  d int);.        
1ea60 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c  if( newVal ) sql
1ea70 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20  ite3PendingByte 
1ea80 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20  = newVal;.      
1ea90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
1eaa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1eab0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1eac0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1ead0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1eae0 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a  _ASSERT, int X).
1eaf0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1eb00 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
1eb10 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
1eb20 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  st to see whethe
1eb30 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  r or not.    ** 
1eb40 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61  assert() was ena
1eb50 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
1eb60 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74  time.  If X is t
1eb70 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  rue and assert()
1eb80 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c  .    ** is enabl
1eb90 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1eba0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75  urn value is tru
1ebb0 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
1ebc0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65   and.    ** asse
1ebd0 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1ebe0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1ebf0 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
1ec00 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a    If X is.    **
1ec10 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
1ec20 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  t() is enabled, 
1ec30 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69  then the asserti
1ec40 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65  on fires and the
1ec50 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1ec60 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73  aborts.  If X is
1ec70 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
1ec80 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
1ec90 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
1eca0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1ecb0 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
1ecc0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1ecd0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b  STCTRL_ASSERT: {
1ece0 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20  .      volatile 
1ecf0 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20  int x = 0;.     
1ed00 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64 65 2d   assert( /*side-
1ed10 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20  effects-ok*/ (x 
1ed20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1ed30 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
1ed40 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61   = x;.      brea
1ed50 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1ed60 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1ed70 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1ed80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1ed90 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20  LWAYS, int X).  
1eda0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1edb0 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1edc0 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1edd0 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20   to see how the 
1ede0 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a  ALWAYS and.    *
1edf0 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77  * NEVER macros w
1ee00 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63  ere defined at c
1ee10 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20  ompile-time..   
1ee20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1ee30 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41  eturn value is A
1ee40 4c 57 41 59 53 28 58 29 20 69 66 20 58 20 69 73  LWAYS(X) if X is
1ee50 20 74 72 75 65 2c 20 6f 72 20 30 20 69 66 20 58   true, or 0 if X
1ee60 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1ee70 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
1ee80 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
1ee90 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
1eea0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
1eeb0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
1eec0 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
1eed0 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
1eee0 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
1eef0 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
1ef00 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
1ef10 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
1ef20 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1ef30 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
1ef40 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
1ef50 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
1ef60 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
1ef70 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
1ef80 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
1ef90 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
1efa0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
1efb0 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
1efc0 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
1efd0 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
1efe0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1eff0 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
1f000 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
1f010 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
1f020 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
1f030 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
1f040 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
1f050 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
1f060 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
1f070 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1f080 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1f090 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1f0a0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1f0b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f0c0 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
1f0d0 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
1f0e0 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
1f0f0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1f100 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
1f110 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f120 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1f130 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
1f140 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
1f150 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
1f160 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
1f170 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
1f180 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
1f190 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1f1a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f1b0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f1c0 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
1f1d0 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1f1e0 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
1f1f0 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
1f200 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
1f210 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
1f220 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
1f230 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1f240 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
1f250 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
1f260 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
1f270 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
1f280 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1f290 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f2a0 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
1f2b0 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
1f2c0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
1f2d0 20 3d 20 78 20 3f 20 41 4c 57 41 59 53 28 78 29   = x ? ALWAYS(x)
1f2e0 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   : 0;.      brea
1f2f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1f300 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  .    **   sqlite
1f310 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1f320 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1f330 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a  YTEORDER);.    *
1f340 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74  *.    ** The int
1f350 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65  eger returned re
1f360 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f  veals the byte-o
1f370 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70  rder of the comp
1f380 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20  uter on which.  
1f390 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72    ** SQLite is r
1f3a0 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20  unning:.    **. 
1f3b0 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20     **       1   
1f3c0 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
1f3d0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1f3e0 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1f3f0 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c      10     littl
1f400 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
1f410 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  ined at run-time
1f420 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20  .    **  432101 
1f430 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1f440 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1f450 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1f460 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20    **  123410    
1f470 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
1f480 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
1f490 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
1f4a0 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  / .    case SQLI
1f4b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
1f4c0 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ORDER: {.      r
1f4d0 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  c = SQLITE_BYTEO
1f4e0 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54  RDER*100 + SQLIT
1f4f0 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31  E_LITTLEENDIAN*1
1f500 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e  0 + SQLITE_BIGEN
1f510 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61  DIAN;.      brea
1f520 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1f530 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1f540 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1f550 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
1f560 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1f570 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1f580 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65  ** Set the nRese
1f590 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f  rve size to N fo
1f5a0 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
1f5b0 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ase on the datab
1f5c0 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65  ase.    ** conne
1f5d0 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f  ction db..    */
1f5e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f5f0 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1f600 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1f610 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1f620 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1f630 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1f640 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1f650 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1f660 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1f670 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f680 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
1f690 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
1f6a0 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20   0, x, 0);.     
1f6b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1f6c0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1f6d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f6e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1f6f0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f700 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f710 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
1f720 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1f730 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1f740 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1f750 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74  able various opt
1f760 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74  imizations for t
1f770 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
1f780 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72    The .    ** ar
1f790 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69  gument N is a bi
1f7a0 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
1f7b0 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ations to be dis
1f7c0 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d  abled.  For norm
1f7d0 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  al.    ** operat
1f7e0 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20  ion N should be 
1f7f0 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20  0.  The idea is 
1f800 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67  that a test prog
1f810 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20  ram (like the.  
1f820 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54    ** SQL Logic T
1f830 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20  est or SLT test 
1f840 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20  module) can run 
1f850 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c  the same SQL mul
1f860 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20  tiple times.    
1f870 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20  ** with various 
1f880 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69  optimizations di
1f890 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79  sabled to verify
1f8a0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
1f8b0 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  nswer.    ** is 
1f8c0 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72  obtained in ever
1f8d0 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  y case..    */. 
1f8e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1f8f0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
1f900 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73  TIONS: {.      s
1f910 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1f920 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1f930 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f  );.      db->dbO
1f940 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28  ptFlags = (u16)(
1f950 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20  va_arg(ap, int) 
1f960 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20  & 0xffff);.     
1f970 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1f980 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1f990 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1f9a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1f9b0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
1f9c0 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
1f9d0 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
1f9e0 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
1f9f0 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72  n-zero, configur
1fa00 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73  e the wrappers s
1fa10 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a  o that all.    *
1fa20 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * subsequent cal
1fa30 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28  ls to localtime(
1fa40 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66  ) and variants f
1fa50 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73  ail. If onoff is
1fa60 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e   zero,.    ** un
1fa70 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  do this setting.
1fa80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1fa90 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1faa0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
1fab0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1fac0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
1fad0 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20  ocaltimeFault = 
1fae0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1faf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fb00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1fb10 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1fb20 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1fb30 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
1fb40 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20  , int);.    **. 
1fb50 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65     ** Set or cle
1fb60 61 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  ar a flag that i
1fb70 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1fb80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fb90 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a  is always well-.
1fba0 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e      ** formed an
1fbb0 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e  d never corrupt.
1fbc0 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63    This flag is c
1fbd0 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c  lear by default,
1fbe0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
1fbf0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1fc00 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76   files might hav
1fc10 65 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72  e arbitrary corr
1fc20 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67  uption.  Setting
1fc30 20 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67   the flag during
1fc40 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20  .    ** testing 
1fc50 63 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61  causes certain a
1fc60 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1fc70 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74  ts in the code t
1fc80 6f 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20  o be activated. 
1fc90 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e     ** that demon
1fca0 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73  strat invariants
1fcb0 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20   on well-formed 
1fcc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
1fcd0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1fce0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fcf0 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b  NEVER_CORRUPT: {
1fd00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1fd10 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72  obalConfig.never
1fd20 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67  Corrupt = va_arg
1fd30 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1fd40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1fd50 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 74 68     /* Set the th
1fd60 72 65 73 68 6f 6c 64 20 61 74 20 77 68 69 63 68  reshold at which
1fd70 20 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e 74 65 72   OP_Once counter
1fd80 73 20 72 65 73 65 74 20 62 61 63 6b 20 74 6f 20  s reset back to 
1fd90 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 20 42 79 20  zero..    ** By 
1fda0 64 65 66 61 75 6c 74 20 74 68 69 73 20 69 73 20  default this is 
1fdb0 30 78 37 66 66 66 66 66 66 65 20 28 6f 76 65 72  0x7ffffffe (over
1fdc0 20 32 20 62 69 6c 6c 69 6f 6e 29 2c 20 62 75 74   2 billion), but
1fdd0 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 0a 20   that value is. 
1fde0 20 20 20 2a 2a 20 74 6f 6f 20 62 69 67 20 74 6f     ** too big to
1fdf0 20 74 65 73 74 20 69 6e 20 61 20 72 65 61 73 6f   test in a reaso
1fe00 6e 61 62 6c 65 20 61 6d 6f 75 6e 74 20 6f 66 20  nable amount of 
1fe10 74 69 6d 65 2c 20 73 6f 20 74 68 69 73 20 63 6f  time, so this co
1fe20 6e 74 72 6f 6c 20 69 73 0a 20 20 20 20 2a 2a 20  ntrol is.    ** 
1fe30 70 72 6f 76 69 64 65 64 20 74 6f 20 73 65 74 20  provided to set 
1fe40 61 20 73 6d 61 6c 6c 20 61 6e 64 20 65 61 73 69  a small and easi
1fe50 6c 79 20 72 65 61 63 68 61 62 6c 65 20 72 65 73  ly reachable res
1fe60 65 74 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f  et value..    */
1fe70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1fe80 5f 54 45 53 54 43 54 52 4c 5f 4f 4e 43 45 5f 52  _TESTCTRL_ONCE_R
1fe90 45 53 45 54 5f 54 48 52 45 53 48 4f 4c 44 3a 20  ESET_THRESHOLD: 
1fea0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1feb0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63  lobalConfig.iOnc
1fec0 65 52 65 73 65 74 54 68 72 65 73 68 6f 6c 64 20  eResetThreshold 
1fed0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1fee0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fef0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1ff00 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1ff10 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1ff20 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41  CTRL_VDBE_COVERA
1ff30 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  GE, xCallback, p
1ff40 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tr);.    **.    
1ff50 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20  ** Set the VDBE 
1ff60 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63  coverage callbac
1ff70 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43  k function to xC
1ff80 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e  allback with con
1ff90 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69  text .    ** poi
1ffa0 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f  nter ptr..    */
1ffb0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ffc0 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1ffd0 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65  OVERAGE: {.#ifde
1ffe0 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
1fff0 56 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70  VERAGE.      typ
20000 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e  edef void (*bran
20010 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69  ch_callback)(voi
20020 64 2a 2c 75 6e 73 69 67 6e 65 64 20 69 6e 74 2c  d*,unsigned int,
20030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
20060 63 68 61 72 2c 75 6e 73 69 67 6e 65 64 20 63 68  char,unsigned ch
20070 61 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ar);.      sqlit
20080 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
20090 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f  VdbeBranch = va_
200a0 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61  arg(ap,branch_ca
200b0 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73  llback);.      s
200c0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
200d0 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72  ig.pVdbeBranchAr
200e0 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f  g = va_arg(ap,vo
200f0 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  id*);.#endif.   
20100 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20110 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
20120 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
20130 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
20140 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20  ORTER_MMAP, db, 
20150 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61  nMax); */.    ca
20160 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
20170 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20  RL_SORTER_MMAP: 
20180 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
20190 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
201a0 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
201b0 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
201c0 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
201d0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
201e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
201f0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
20200 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
20210 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
20220 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
20230 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20240 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20  K if SQLite has 
20250 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
20260 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f   and SQLITE_ERRO
20270 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e  R if.    ** not.
20280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
20290 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
202a0 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20  _ISINIT: {.     
202b0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
202c0 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d  alConfig.isInit=
202d0 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
202e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
202f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
20300 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
20310 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
20320 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
20330 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f  R, db, dbName, o
20340 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20  nOff, tnum);.   
20350 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
20360 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20  test control is 
20370 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 69  used to create i
20380 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20  mposter tables. 
20390 20 22 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74   "db" is a point
203a0 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  er.    ** to the
203b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
203c0 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73  tion.  dbName is
203d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
203e0 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f  me (ex: "main" o
203f0 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29  r.    ** "temp")
20400 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65   which will rece
20410 69 76 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ive the imposter
20420 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73  .  "onOff" turns
20430 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f   imposter mode o
20440 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e  n.    ** or off.
20450 20 20 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20    "tnum" is the 
20460 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
20470 20 62 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68   b-tree to which
20480 20 74 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20   the imposter.  
20490 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c    ** table shoul
204a0 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a  d connect..    *
204b0 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20  *.    ** Enable 
204c0 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e  imposter mode on
204d0 6c 79 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ly when the sche
204e0 6d 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ma has already b
204f0 65 65 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65  een parsed.  The
20500 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73  n.    ** run a s
20510 69 6e 67 6c 65 20 43 52 45 41 54 45 20 54 41 42  ingle CREATE TAB
20520 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  LE statement to 
20530 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d  construct the im
20540 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a  poster table in.
20550 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65      ** the parse
20560 64 20 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20  d schema.  Then 
20570 74 75 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f  turn imposter mo
20580 64 65 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69  de back off agai
20590 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  n..    **.    **
205a0 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64   If onOff==0 and
205b0 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73   tnum>0 then res
205c0 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  et the schema fo
205d0 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c  r all databases,
205e0 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20   causing.    ** 
205f0 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65  the schema to be
20600 20 72 65 70 61 72 73 65 64 20 74 68 65 20 6e 65   reparsed the ne
20610 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65  xt time it is ne
20620 65 64 65 64 2e 20 20 54 68 69 73 20 68 61 73 20  eded.  This has 
20630 74 68 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63  the.    ** effec
20640 74 20 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c  t of erasing all
20650 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
20660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
20670 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
20680 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20  L_IMPOSTER: {.  
20690 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
206a0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
206b0 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71  ite3*);.      sq
206c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
206d0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
206e0 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62      db->init.iDb
206f0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
20700 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28  Name(db, va_arg(
20710 61 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  ap,const char*))
20720 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74  ;.      db->init
20730 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  .busy = db->init
20740 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d  .imposterTable =
20750 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
20760 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
20770 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67  newTnum = va_arg
20780 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
20790 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
207a0 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  y==0 && db->init
207b0 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20  .newTnum>0 ){.  
207c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
207d0 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
207e0 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20  nnection(db);.  
207f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
20800 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20810 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
20820 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20830 23 69 66 20 64 65 66 69 6e 65 64 28 59 59 43 4f  #if defined(YYCO
20840 56 45 52 41 47 45 29 0a 20 20 20 20 2f 2a 20 20  VERAGE).    /*  
20850 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
20860 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
20870 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45  CTRL_PARSER_COVE
20880 52 41 47 45 2c 20 46 49 4c 45 20 2a 6f 75 74 29  RAGE, FILE *out)
20890 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
208a0 68 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c  his test control
208b0 20 28 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65   (only available
208c0 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20   when SQLite is 
208d0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20  compiled with.  
208e0 20 20 2a 2a 20 2d 44 59 59 43 4f 56 45 52 41 47    ** -DYYCOVERAG
208f0 45 29 20 77 72 69 74 65 73 20 61 20 72 65 70 6f  E) writes a repo
20900 72 74 20 6f 6e 74 6f 20 22 6f 75 74 22 20 74 68  rt onto "out" th
20910 61 74 20 73 68 6f 77 73 20 61 6c 6c 0a 20 20 20  at shows all.   
20920 20 2a 2a 20 73 74 61 74 65 2f 6c 6f 6f 6b 61 68   ** state/lookah
20930 65 61 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ead combinations
20940 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73   in the parser s
20950 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 20 20 20  tate machine.   
20960 20 2a 2a 20 77 68 69 63 68 20 61 72 65 20 6e 65   ** which are ne
20970 76 65 72 20 65 78 65 72 63 69 73 65 64 2e 20 20  ver exercised.  
20980 49 66 20 61 6e 79 20 73 74 61 74 65 20 69 73 20  If any state is 
20990 6d 69 73 73 65 64 2c 20 6d 61 6b 65 20 74 68 65  missed, make the
209a0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 63  .    ** return c
209b0 6f 64 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ode SQLITE_ERROR
209c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
209d0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
209e0 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47  L_PARSER_COVERAG
209f0 45 3a 20 7b 0a 20 20 20 20 20 20 46 49 4c 45 20  E: {.      FILE 
20a00 2a 6f 75 74 20 3d 20 76 61 5f 61 72 67 28 61 70  *out = va_arg(ap
20a10 2c 20 46 49 4c 45 2a 29 3b 0a 20 20 20 20 20 20  , FILE*);.      
20a20 69 66 28 20 73 71 6c 69 74 65 33 50 61 72 73 65  if( sqlite3Parse
20a30 72 43 6f 76 65 72 61 67 65 28 6f 75 74 29 20 29  rCoverage(out) )
20a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
20a50 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
20a60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
20a70 20 64 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52   defined(YYCOVER
20a80 41 47 45 29 20 2a 2f 0a 20 20 7d 0a 20 20 76 61  AGE) */.  }.  va
20a90 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
20aa0 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 54 45 53   /* SQLITE_UNTES
20ab0 54 41 42 4c 45 20 2a 2f 0a 20 20 72 65 74 75 72  TABLE */.  retur
20ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
20ad0 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
20ae0 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
20af0 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
20b00 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
20b10 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
20b20 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
20b30 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
20b40 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
20b50 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
20b60 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
20b70 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
20b80 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
20b90 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
20ba0 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
20bb0 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
20bc0 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
20bd0 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
20be0 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
20bf0 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
20c00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
20c10 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
20c20 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
20c30 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
20c40 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
20c50 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
20c60 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
20c70 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
20c80 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
20c90 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
20ca0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
20cb0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
20cc0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
20cd0 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
20ce0 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
20cf0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
20d00 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
20d10 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
20d20 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
20d30 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
20d40 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61  lename==0 || zPa
20d50 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ram==0 ) return 
20d60 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  0;.  zFilename +
20d70 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
20d80 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
20d90 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65  ;.  while( zFile
20da0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
20db0 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46  nt x = strcmp(zF
20dc0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
20dd0 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
20de0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
20df0 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
20e00 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20  1;.    if( x==0 
20e10 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61  ) return zFilena
20e20 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  me;.    zFilenam
20e30 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
20e40 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
20e50 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  + 1;.  }.  retur
20e60 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
20e70 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76  turn a boolean v
20e80 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79  alue for a query
20e90 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69   parameter..*/.i
20ea0 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  nt sqlite3_uri_b
20eb0 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61  oolean(const cha
20ec0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
20ed0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
20ee0 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20  , int bDflt){.  
20ef0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
20f00 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
20f10 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
20f20 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c   zParam);.  bDfl
20f30 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20  t = bDflt!=0;.  
20f40 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74  return z ? sqlit
20f50 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20  e3GetBoolean(z, 
20f60 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a  bDflt) : bDflt;.
20f70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20f80 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
20f90 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
20fa0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
20fb0 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
20fc0 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34  qlite3_uri_int64
20fd0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
20fe0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a  zFilename,    /*
20ff0 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73   Filename as pas
21000 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a  sed to xOpen */.
21010 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
21020 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55  aram,       /* U
21030 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75  RI parameter sou
21040 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ght */.  sqlite3
21050 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20  _int64 bDflt    
21060 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20     /* return if 
21070 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73  parameter is mis
21080 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  sing */.){.  con
21090 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
210a0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
210b0 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
210c0 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  aram);.  sqlite3
210d0 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20  _int64 v;.  if( 
210e0 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f  z && sqlite3DecO
210f0 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29  rHexToI64(z, &v)
21100 3d 3d 30 20 29 7b 0a 20 20 20 20 62 44 66 6c 74  ==0 ){.    bDflt
21110 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = v;.  }.  retu
21120 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  rn bDflt;.}../*.
21130 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74  ** Return the Bt
21140 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e  ree pointer iden
21150 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d  tified by zDbNam
21160 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
21170 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
21180 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44  .Btree *sqlite3D
21190 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c  bNameToBtree(sql
211a0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
211b0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
211c0 20 20 69 6e 74 20 69 44 62 20 3d 20 7a 44 62 4e    int iDb = zDbN
211d0 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 46 69 6e  ame ? sqlite3Fin
211e0 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 4e  dDbName(db, zDbN
211f0 61 6d 65 29 20 3a 20 30 3b 0a 20 20 72 65 74 75  ame) : 0;.  retu
21200 72 6e 20 69 44 62 3c 30 20 3f 20 30 20 3a 20 64  rn iDb<0 ? 0 : d
21210 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
21220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21230 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66   the filename of
21240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
21250 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
21260 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
21270 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74  ection..*/.const
21280 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64   char *sqlite3_d
21290 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74  b_filename(sqlit
212a0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
212b0 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
212c0 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64  Btree *pBt;.#ifd
212d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
212e0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
212f0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
21300 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
21310 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
21320 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
21330 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
21340 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c  ndif.  pBt = sql
21350 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
21360 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
21370 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73    return pBt ? s
21380 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
21390 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b  lename(pBt) : 0;
213a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
213b0 20 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69   1 if database i
213c0 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30  s read-only or 0
213d0 20 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20   if read/write. 
213e0 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a   Return -1 if.**
213f0 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73   no such databas
21400 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74  e exists..*/.int
21410 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64   sqlite3_db_read
21420 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62  only(sqlite3 *db
21430 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
21440 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20  bName){.  Btree 
21450 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  *pBt;.#ifdef SQL
21460 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
21470 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
21480 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
21490 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
214a0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
214b0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
214c0 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
214d0 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44    pBt = sqlite3D
214e0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
214f0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
21500 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
21510 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79  3BtreeIsReadonly
21520 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23  (pBt) : -1;.}..#
21530 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
21540 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a  BLE_SNAPSHOT./*.
21550 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 6e 61 70  ** Obtain a snap
21560 73 68 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72 20  shot handle for 
21570 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  the snapshot of 
21580 64 61 74 61 62 61 73 65 20 7a 44 62 20 63 75 72  database zDb cur
21590 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67  rently .** being
215a0 20 72 65 61 64 20 62 79 20 68 61 6e 64 6c 65 20   read by handle 
215b0 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
215c0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28  e3_snapshot_get(
215d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
215e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
215f0 44 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  Db,.  sqlite3_sn
21600 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73  apshot **ppSnaps
21610 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  hot.){.  int rc 
21620 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
21630 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21640 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20  MIT_WAL..#ifdef 
21650 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
21660 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
21670 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
21680 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
21690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
216a0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
216b0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
216c0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
216d0 75 74 65 78 29 3b 0a 0a 20 20 69 66 28 20 64 62  utex);..  if( db
216e0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
216f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  ){.    int iDb =
21700 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
21710 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  me(db, zDb);.   
21720 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
21730 44 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74  Db>1 ){.      Bt
21740 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
21750 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
21760 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
21770 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
21780 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
21790 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
217a0 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
217b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
217c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
217d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
217e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
217f0 53 6e 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69  SnapshotGet(sqli
21800 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
21810 74 29 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b  t), ppSnapshot);
21820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21830 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21840 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
21850 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
21860 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49  #endif   /* SQLI
21870 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20  TE_OMIT_WAL */. 
21880 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21890 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64  *.** Open a read
218a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
218b0 74 68 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65  the snapshot ide
218c0 6e 64 69 66 69 65 64 20 62 79 20 70 53 6e 61 70  ndified by pSnap
218d0 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  shot..*/.int sql
218e0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  ite3_snapshot_op
218f0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en(.  sqlite3 *d
21900 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
21910 20 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65   *zDb, .  sqlite
21920 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61  3_snapshot *pSna
21930 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72  pshot.){.  int r
21940 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
21950 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21960 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65  _OMIT_WAL..#ifde
21970 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21980 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
21990 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
219a0 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
219b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
219c0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
219d0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
219e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
219f0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
21a00 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
21a10 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   ){.    int iDb;
21a20 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
21a30 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
21a40 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69   zDb);.    if( i
21a50 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29  Db==0 || iDb>1 )
21a60 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
21a70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Bt = db->aDb[iDb
21a80 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
21a90 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
21aa0 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29  nTrans(pBt)==0 )
21ab0 7b 0a 20 20 20 20 20 20 20 20 50 61 67 65 72 20  {.        Pager 
21ac0 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
21ad0 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
21ae0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 55  ;.        int bU
21af0 6e 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  nlock = 0;.     
21b00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
21b10 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73  reeIsInReadTrans
21b20 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
21b30 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
21b40 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20  Active==0 ){.   
21b50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21b60 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
21b70 6f 74 43 68 65 63 6b 28 70 50 61 67 65 72 2c 20  otCheck(pPager, 
21b80 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20  pSnapshot);.    
21b90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
21ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21bb0 20 20 20 20 20 20 20 20 20 20 20 62 55 6e 6c 6f             bUnlo
21bc0 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
21bd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21be0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42  e3BtreeCommit(pB
21bf0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
21c00 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
21c10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21c20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
21c30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
21c40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
21c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21c60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21c70 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
21c80 74 4f 70 65 6e 28 70 50 61 67 65 72 2c 20 70 53  tOpen(pPager, pS
21c90 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
21ca0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21cc0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21cd0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
21ce0 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30  nTrans(pBt, 0, 0
21cf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
21d00 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
21d10 74 4f 70 65 6e 28 70 50 61 67 65 72 2c 20 30 29  tOpen(pPager, 0)
21d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21d30 20 20 20 20 69 66 28 20 62 55 6e 6c 6f 63 6b 20      if( bUnlock 
21d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21d50 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
21d60 74 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  tUnlock(pPager);
21d70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21d80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21d90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
21da0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
21db0 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49  #endif   /* SQLI
21dc0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20  TE_OMIT_WAL */. 
21dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21de0 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20  *.** Recover as 
21df0 6d 61 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61  many snapshots a
21e00 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20  s possible from 
21e10 74 68 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73  the wal file ass
21e20 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
21e30 73 63 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61  schema zDb of da
21e40 74 61 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e  tabase db..*/.in
21e50 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  t sqlite3_snapsh
21e60 6f 74 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74  ot_recover(sqlit
21e70 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
21e80 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20  ar *zDb){.  int 
21e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
21ea0 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69  R;.  int iDb;.#i
21eb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21ec0 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
21ed0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
21ee0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
21ef0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
21f00 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
21f10 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
21f20 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
21f30 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  if..  sqlite3_mu
21f40 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
21f50 74 65 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  tex);.  iDb = sq
21f60 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
21f70 64 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  db, zDb);.  if( 
21f80 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20  iDb==0 || iDb>1 
21f90 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
21fa0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
21fb0 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d  .pBt;.    if( 0=
21fc0 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49  =sqlite3BtreeIsI
21fd0 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20  nReadTrans(pBt) 
21fe0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21ff0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
22000 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  rans(pBt, 0, 0);
22010 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
22020 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22030 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22040 50 61 67 65 72 53 6e 61 70 73 68 6f 74 52 65 63  PagerSnapshotRec
22050 6f 76 65 72 28 73 71 6c 69 74 65 33 42 74 72 65  over(sqlite3Btre
22060 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20  ePager(pBt));.  
22070 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
22080 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  eeCommit(pBt);. 
22090 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
220a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
220b0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
220c0 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
220d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
220e0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
220f0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
22100 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f  napshot handle o
22110 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
22120 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
22130 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  t()..*/.void sql
22140 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
22150 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  ee(sqlite3_snaps
22160 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b  hot *pSnapshot){
22170 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
22180 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65  pSnapshot);.}.#e
22190 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
221a0 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
221b0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
221c0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
221d0 54 49 4f 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a  TION_DIAGS./*.**
221e0 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
221f0 6f 66 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  of a compile-tim
22200 65 20 6f 70 74 69 6f 6e 2c 20 72 65 74 75 72 6e  e option, return
22210 20 74 72 75 65 20 69 66 20 74 68 61 74 20 6f 70   true if that op
22220 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64  tion.** was used
22230 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
22240 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d  t..**.** The nam
22250 65 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79  e can optionally
22260 20 62 65 67 69 6e 20 77 69 74 68 20 22 53 51 4c   begin with "SQL
22270 49 54 45 5f 22 20 62 75 74 20 74 68 65 20 22 53  ITE_" but the "S
22280 51 4c 49 54 45 5f 22 20 70 72 65 66 69 78 0a 2a  QLITE_" prefix.*
22290 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  * is not require
222a0 64 20 66 6f 72 20 61 20 6d 61 74 63 68 2e 0a 2a  d for a match..*
222b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
222c0 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64  mpileoption_used
222d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70  (const char *zOp
222e0 74 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c  tName){.  int i,
222f0 20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a   n;.  int nOpt;.
22300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
22310 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a 23  zCompileOpt;. .#
22320 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
22330 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
22340 20 7a 4f 70 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zOptName==0 ){.
22350 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
22360 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
22370 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
22380 23 65 6e 64 69 66 0a 0a 20 20 61 7a 43 6f 6d 70  #endif..  azComp
22390 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  ileOpt = sqlite3
223a0 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26  CompileOptions(&
223b0 6e 4f 70 74 29 3b 0a 0a 20 20 69 66 28 20 73 71  nOpt);..  if( sq
223c0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f  lite3StrNICmp(zO
223d0 70 74 4e 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f  ptName, "SQLITE_
223e0 22 2c 20 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e  ", 7)==0 ) zOptN
223f0 61 6d 65 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20  ame += 7;.  n = 
22400 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
22410 7a 4f 70 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  zOptName);..  /*
22420 20 53 69 6e 63 65 20 6e 4f 70 74 20 69 73 20 6e   Since nOpt is n
22430 6f 72 6d 61 6c 6c 79 20 69 6e 20 73 69 6e 67 6c  ormally in singl
22440 65 20 64 69 67 69 74 73 2c 20 61 20 6c 69 6e 65  e digits, a line
22450 61 72 20 73 65 61 72 63 68 20 69 73 20 0a 20 20  ar search is .  
22460 2a 2a 20 61 64 65 71 75 61 74 65 2e 20 4e 6f 20  ** adequate. No 
22470 6e 65 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72  need for a binar
22480 79 20 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20 66  y search. */.  f
22490 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20  or(i=0; i<nOpt; 
224a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
224b0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f  lite3StrNICmp(zO
224c0 70 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c  ptName, azCompil
224d0 65 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20  eOpt[i], n)==0. 
224e0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
224f0 49 64 43 68 61 72 28 28 75 6e 73 69 67 6e 65 64  IdChar((unsigned
22500 20 63 68 61 72 29 61 7a 43 6f 6d 70 69 6c 65 4f   char)azCompileO
22510 70 74 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20  pt[i][n])==0.   
22520 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22530 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
22540 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
22550 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4e 2d  ** Return the N-
22560 74 68 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  th compile-time 
22570 6f 70 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20  option string.  
22580 49 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  If N is out of r
22590 61 6e 67 65 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  ange,.** return 
225a0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
225b0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
225c0 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
225d0 74 69 6f 6e 5f 67 65 74 28 69 6e 74 20 4e 29 7b  tion_get(int N){
225e0 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63  .  int nOpt;.  c
225f0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f  onst char **azCo
22600 6d 70 69 6c 65 4f 70 74 3b 0a 20 20 61 7a 43 6f  mpileOpt;.  azCo
22610 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74  mpileOpt = sqlit
22620 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  e3CompileOptions
22630 28 26 6e 4f 70 74 29 3b 0a 20 20 69 66 28 20 4e  (&nOpt);.  if( N
22640 3e 3d 30 20 26 26 20 4e 3c 6e 4f 70 74 20 29 7b  >=0 && N<nOpt ){
22650 0a 20 20 20 20 72 65 74 75 72 6e 20 61 7a 43 6f  .    return azCo
22660 6d 70 69 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d  mpileOpt[N];.  }
22670 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
22680 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
22690 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
226a0 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a              ON_DIAGS */.