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

Artifact 2d3ee4859df528385bc072e418fdb30af91648234e20d4e6abfda7d789704e46:


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 23 69 66 64 65 66 20 53 51  ES */..#ifdef SQ
5de0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
5df0: 52 49 41 4c 49 5a 45 0a 20 20 20 20 63 61 73 65  RIALIZE.    case
5e00: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5e10: 45 4d 44 42 5f 4d 41 58 53 49 5a 45 3a 20 7b 0a  EMDB_MAXSIZE: {.
5e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5e30: 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 65 6d 64  balConfig.mxMemd
5e40: 62 53 69 7a 65 20 3d 20 76 61 5f 61 72 67 28 61  bSize = va_arg(a
5e50: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
5e60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5e70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5e80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
5e90: 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 0a 20 20  SERIALIZE */..  
5ea0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5eb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5ec0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
5ed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
5ee0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5ef0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5f00: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
5f10: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
5f20: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
5f30: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
5f40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5f50: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
5f60: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
5f70: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
5f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
5fa0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5fb0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5fc0: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
5fd0: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
5fe0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
5ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
6000: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
6010: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
6020: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
6030: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
6040: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
6050: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
6060: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
6070: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
6080: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
6090: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
60a0: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
60b0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
60c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
60d0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
60e0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
60f0: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
6100: 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20  t cnt){.#ifndef 
6110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
6120: 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53  ASIDE.  void *pS
6130: 74 61 72 74 3b 0a 20 20 0a 20 20 69 66 28 20 73  tart;.  .  if( s
6140: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
6150: 73 65 64 28 64 62 2c 30 29 3e 30 20 29 7b 0a 20  sed(db,0)>0 ){. 
6160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6170: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
6180: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
6190: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
61a0: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
61b0: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
61c0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
61d0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
61e0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
61f0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
6200: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
6210: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
6220: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6230: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6240: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6250: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6260: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6270: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6280: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6290: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
62a0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
62b0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
62c0: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
62d0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
62e0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
62f0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
6300: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
6310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6320: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6330: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6340: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6350: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6360: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6370: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6390: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
63a0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
63b0: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
63c0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
63d0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
63e0: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
63f0: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
6400: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
6410: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
6420: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
6430: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
6440: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
6450: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
6460: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
6470: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
6480: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
6490: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74  >lookaside.pInit
64a0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
64b0: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b  aside.pFree = 0;
64c0: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
64d0: 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20  .sz = (u16)sz;. 
64e0: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
64f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f     int i;.    Lo
6500: 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a  okasideSlot *p;.
6510: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e      assert( sz >
6520: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f   (int)sizeof(Loo
6530: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a  kasideSlot*) );.
6540: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6550: 65 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a 20  e.nSlot = cnt;. 
6560: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
6570: 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20  eSlot*)pStart;. 
6580: 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20     for(i=cnt-1; 
6590: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
65a0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
65b0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74  >lookaside.pInit
65c0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
65d0: 61 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70 3b  aside.pInit = p;
65e0: 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  .      p = (Look
65f0: 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38  asideSlot*)&((u8
6600: 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a  *)p)[sz];.    }.
6610: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6620: 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20  e.pEnd = p;.    
6630: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
6640: 69 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  isable = 0;.    
6650: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6660: 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d  alloced = pBuf==
6670: 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b  0 ?1:0;.  }else{
6680: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6690: 64 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a  de.pStart = db;.
66a0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
66b0: 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20  e.pEnd = db;.   
66c0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
66d0: 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  Disable = 1;.   
66e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
66f0: 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20  Malloced = 0;.  
6700: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6710: 6e 53 6c 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  nSlot = 0;.  }.#
6720: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6730: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a  OMIT_LOOKASIDE *
6740: 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
6750: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6760: 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20  eturn the mutex 
6770: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6780: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
6790: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ction..*/.sqlite
67a0: 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33  3_mutex *sqlite3
67b0: 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65  _db_mutex(sqlite
67c0: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
67d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
67e0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
67f0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6800: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
6810: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
6820: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
6830: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
6840: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75  .  return db->mu
6850: 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  tex;.}../*.** Fr
6860: 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65  ee up as much me
6870: 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66  mory as we can f
6880: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61  rom the given da
6890: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
68a0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
68b0: 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
68c0: 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a  memory(sqlite3 *
68d0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  db){.  int i;..#
68e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
68f0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
6900: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
6910: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
6920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6930: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
6940: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
6950: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6960: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
6970: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
6980: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
6990: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
69a0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
69b0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
69c0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
69d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
69e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
69f0: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
6a00: 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
6a10: 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nk(pPager);.    
6a20: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
6a30: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
6a40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
6a50: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
6a60: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
6a70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6a80: 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79   Flush any dirty
6a90: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
6aa0: 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e  ger-cache for an
6ab0: 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  y attached datab
6ac0: 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a  ase.** to disk..
6ad0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
6ae0: 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c  b_cacheflush(sql
6af0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6b00: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
6b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
6b20: 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a  bSeenBusy = 0;..
6b30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6b40: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
6b50: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
6b60: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
6b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
6b80: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6b90: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6ba0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6bb0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6bc0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6bd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
6be0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
6bf0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6c00: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
6c10: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
6c20: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
6c30: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
6c40: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
6c50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6c60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
6c70: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
6c80: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6c90: 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a  rFlush(pPager);.
6ca0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6cb0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
6cc0: 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d       bSeenBusy =
6cd0: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
6ce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6cf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6d00: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
6d10: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
6d20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6d30: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6d40: 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
6d50: 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73  E_OK && bSeenBus
6d60: 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  y) ? SQLITE_BUSY
6d70: 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
6d80: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   Configuration s
6d90: 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69  ettings for an i
6da0: 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61  ndividual databa
6db0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f  se connection.*/
6dc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
6dd0: 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a  config(sqlite3 *
6de0: 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  db, int op, ...)
6df0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
6e00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
6e10: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
6e20: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
6e30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42    case SQLITE_DB
6e40: 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d  CONFIG_MAINDBNAM
6e50: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d  E: {.      /* IM
6e60: 50 3a 20 52 2d 30 36 38 32 34 2d 32 38 35 33 31  P: R-06824-28531
6e70: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50   */.      /* IMP
6e80: 3a 20 52 2d 33 36 32 35 37 2d 35 32 31 32 35 20  : R-36257-52125 
6e90: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  */.      db->aDb
6ea0: 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 76  [0].zDbSName = v
6eb0: 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b  a_arg(ap,char*);
6ec0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6ed0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  TE_OK;.      bre
6ee0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6ef0: 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  se SQLITE_DBCONF
6f00: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
6f10: 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66        void *pBuf
6f20: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
6f30: 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  id*); /* IMP: R-
6f40: 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20  26835-10964 */. 
6f50: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61       int sz = va
6f60: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
6f70: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
6f80: 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20  7871-25994 */.  
6f90: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61      int cnt = va
6fa0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
6fb0: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34      /* IMP: R-04
6fc0: 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20  460-53386 */.   
6fd0: 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f     rc = setupLoo
6fe0: 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c  kaside(db, pBuf,
6ff0: 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20   sz, cnt);.     
7000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7010: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7020: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7030: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20  struct {.       
7040: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a   int op;      /*
7050: 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   The opcode */. 
7060: 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b         u32 mask;
7070: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
7080: 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65  he bit in sqlite
7090: 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63  3.flags to set/c
70a0: 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20  lear */.      } 
70b0: 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aFlagOp[] = {.  
70c0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
70d0: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
70e0: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 53  KEY,           S
70f0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
7100: 73 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  s    },.        
7110: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
7120: 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
7130: 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
7140: 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d  EnableTrigger  }
7150: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
7160: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
7170: 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45  LE_FTS3_TOKENIZE
7180: 52 2c 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f  R, SQLITE_Fts3To
7190: 6b 65 6e 69 7a 65 72 20 20 7d 2c 0a 20 20 20 20  kenizer  },.    
71a0: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
71b0: 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41  ONFIG_ENABLE_LOA
71c0: 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 20 53 51 4c  D_EXTENSION, SQL
71d0: 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  ITE_LoadExtensio
71e0: 6e 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  n  },.        { 
71f0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
7200: 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45  NO_CKPT_ON_CLOSE
7210: 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 6f  ,      SQLITE_No
7220: 43 6b 70 74 4f 6e 43 6c 6f 73 65 20 20 7d 2c 0a  CkptOnClose  },.
7230: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
7240: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
7250: 5f 51 50 53 47 2c 20 20 20 20 20 20 20 20 20 20  _QPSG,          
7260: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
7270: 53 47 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  SG     },.      
7280: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
7290: 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
72a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
72b0: 45 5f 54 72 69 67 67 65 72 45 51 50 20 20 20 20  E_TriggerEQP    
72c0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
72d0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45  LITE_DBCONFIG_RE
72e0: 53 45 54 5f 44 41 54 41 42 41 53 45 2c 20 20 20  SET_DATABASE,   
72f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 52 65 73 65       SQLITE_Rese
7300: 74 44 61 74 61 62 61 73 65 20 20 7d 2c 0a 20 20  tDatabase  },.  
7310: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
7320: 42 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56  BCONFIG_DEFENSIV
7330: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53  E,             S
7340: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20  QLITE_Defensive 
7350: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b       },.      };
7360: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
7370: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20  int i;.      rc 
7380: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
7390: 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d  /* IMP: R-42790-
73a0: 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66  23372 */.      f
73b0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
73c0: 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b  ize(aFlagOp); i+
73d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
73e0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f  aFlagOp[i].op==o
73f0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
7400: 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72  nt onoff = va_ar
7410: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
7420: 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20        int *pRes 
7430: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
7440: 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 36  *);.          u6
7450: 34 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d  4 oldFlags = db-
7460: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
7470: 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b    if( onoff>0 ){
7480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
7490: 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f  >flags |= aFlagO
74a0: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
74b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
74c0: 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  noff==0 ){.     
74d0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
74e0: 20 26 3d 20 7e 28 75 36 34 29 61 46 6c 61 67 4f   &= ~(u64)aFlagO
74f0: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
7500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7510: 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64   if( oldFlags!=d
7520: 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  b->flags ){.    
7530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7540: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
7550: 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a  tements(db, 0);.
7560: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7570: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
7580: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
7590: 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  Res = (db->flags
75a0: 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61   & aFlagOp[i].ma
75b0: 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  sk)!=0;.        
75c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
75d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
75e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
75f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7600: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7610: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
7620: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
7630: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
7640: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
7650: 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d  buffer z[0..n-1]
7660: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70   contains all sp
7670: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
7680: 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f  int allSpaces(co
7690: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
76a0: 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e   n){.  while( n>
76b0: 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27  0 && z[n-1]==' '
76c0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74   ){ n--; }.  ret
76d0: 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn n==0;.}../*.
76e0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
76f0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
7700: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
7710: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
7720: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
7730: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
7740: 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75  the padFlag argu
7750: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
7760: 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64   then space padd
7770: 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  ing at the end.*
7780: 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20  * of strings is 
7790: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
77a0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54  mplements the RT
77b0: 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  RIM collation..*
77c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e  /.static int bin
77d0: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
77e0: 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74   *padFlag,.  int
77f0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
7800: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
7810: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
7820: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
7830: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
7840: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
7850: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f  ey1 : nKey2;.  /
7860: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
7870: 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68 65  -65033-28449 The
7880: 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59   built-in BINARY
7890: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61   collation compa
78a0: 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73  res.  ** strings
78b0: 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75 73   byte by byte us
78c0: 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29  ing the memcmp()
78d0: 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74   function from t
78e0: 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20  he standard C.  
78f0: 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20  ** library. */. 
7900: 20 61 73 73 65 72 74 28 20 70 4b 65 79 31 20 26   assert( pKey1 &
7910: 26 20 70 4b 65 79 32 20 29 3b 0a 20 20 72 63 20  & pKey2 );.  rc 
7920: 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20  = memcmp(pKey1, 
7930: 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28  pKey2, n);.  if(
7940: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
7950: 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26  ( padFlag.     &
7960: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
7970: 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b  ar*)pKey1)+n, nK
7980: 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61  ey1-n).     && a
7990: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
79a0: 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32  )pKey2)+n, nKey2
79b0: 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  -n).    ){.     
79c0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
79d0: 20 52 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52   R-31624-24737 R
79e0: 54 52 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e  TRIM is like BIN
79f0: 41 52 59 20 65 78 63 65 70 74 20 74 68 61 74 20  ARY except that 
7a00: 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73  extra.      ** s
7a10: 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64  paces at the end
7a20: 20 6f 66 20 65 69 74 68 65 72 20 73 74 72 69 6e   of either strin
7a30: 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  g do not change 
7a40: 74 68 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f  the result. In o
7a50: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f  ther.      ** wo
7a60: 72 64 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c  rds, strings wil
7a70: 6c 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  l compare equal 
7a80: 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61  to one another a
7a90: 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20  s long as they. 
7aa0: 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f       ** differ o
7ab0: 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65  nly in the numbe
7ac0: 72 20 6f 66 20 73 70 61 63 65 73 20 61 74 20 74  r of spaces at t
7ad0: 68 65 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f  he end..      */
7ae0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7af0: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
7b00: 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key2;.    }.  }.
7b10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7b20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
7b30: 65 20 69 66 20 43 6f 6c 6c 53 65 71 20 69 73 20  e if CollSeq is 
7b40: 74 68 65 20 64 65 66 61 75 6c 74 20 62 75 69 6c  the default buil
7b50: 74 2d 69 6e 20 42 49 4e 41 52 59 2e 0a 2a 2f 0a  t-in BINARY..*/.
7b60: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 42 69 6e  int sqlite3IsBin
7b70: 61 72 79 28 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  ary(const CollSe
7b80: 71 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  q *p){.  assert(
7b90: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 78 43 6d 70   p==0 || p->xCmp
7ba0: 21 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 7c 7c  !=binCollFunc ||
7bb0: 20 70 2d 3e 70 55 73 65 72 21 3d 30 0a 20 20 20   p->pUser!=0.   
7bc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
7bd0: 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 22 42 49 4e  mp(p->zName,"BIN
7be0: 41 52 59 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65  ARY")==0 );.  re
7bf0: 74 75 72 6e 20 70 3d 3d 30 20 7c 7c 20 28 70 2d  turn p==0 || (p-
7c00: 3e 78 43 6d 70 3d 3d 62 69 6e 43 6f 6c 6c 46 75  >xCmp==binCollFu
7c10: 6e 63 20 26 26 20 70 2d 3e 70 55 73 65 72 3d 3d  nc && p->pUser==
7c20: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  0);.}../*.** Ano
7c30: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
7c40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7c50: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
7c60: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
7c70: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
7c80: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
7c90: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
7ca0: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
7cb0: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
7cc0: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
7cd0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
7ce0: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
7cf0: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
7d00: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
7d10: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
7d20: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
7d30: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
7d40: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
7d50: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
7d60: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
7d70: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
7d80: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
7d90: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
7da0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7db0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7dc0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7dd0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7de0: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
7df0: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
7e00: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7e10: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
7e20: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
7e30: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
7e40: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
7e50: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
7e60: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
7e70: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
7e80: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
7e90: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
7ea0: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
7eb0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
7ec0: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
7ed0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
7ee0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7ef0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
7f00: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7f10: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7f20: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7f30: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7f40: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7f50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7f60: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
7f70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
7f80: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
7f90: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  id;.}../*.** Set
7fa0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
7fb0: 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ned by the sqlit
7fc0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7fd0: 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74  owid() API funct
7fe0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7ff0: 69 74 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e  ite3_set_last_in
8000: 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74  sert_rowid(sqlit
8010: 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f  e3 *db, sqlite3_
8020: 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23  int64 iRowid){.#
8030: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8040: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
8050: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
8060: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
8070: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
8080: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
8090: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
80a0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
80b0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
80c0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61  mutex);.  db->la
80d0: 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
80e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
80f0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8100: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  x);.}../*.** Ret
8110: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8120: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
8130: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
8140: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
8150: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
8160: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
8170: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
8180: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
8190: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
81a0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
81b0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
81c0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
81d0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
81e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
81f0: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
8200: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
8210: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8220: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
8230: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
8240: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
8250: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
8260: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
8270: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
8280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8290: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
82a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
82b0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
82c0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
82d0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
82e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
82f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
8300: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
8310: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
8320: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
8330: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
8340: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
8350: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
8360: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
8370: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
8380: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
8390: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
83a0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
83b0: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
83c0: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
83d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
83e0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
83f0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
8400: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
8410: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
8420: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
8430: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
8440: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
8450: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
8460: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8470: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
8480: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
8490: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
84a0: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
84b0: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
84c0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
84d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
84e0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
84f0: 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  nction associate
8500: 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70  d with FuncDef p
8510: 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74  , if any. Except
8520: 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  ,.** if this is 
8530: 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70  not the last cop
8540: 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  y of the functio
8550: 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  n, do not invoke
8560: 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a   it. Multiple.**
8570: 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e   copies of a sin
8580: 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  gle function are
8590: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72   created when cr
85a0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  eate_function() 
85b0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74  is called.** wit
85c0: 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20  h SQLITE_ANY as 
85d0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  the encoding..*/
85e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e  .static void fun
85f0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c  ctionDestroy(sql
8600: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
8610: 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73  f *p){.  FuncDes
8620: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
8630: 63 74 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73  ctor = p->u.pDes
8640: 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70  tructor;.  if( p
8650: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
8660: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
8670: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8680: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
8690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65  ==0 ){.      pDe
86a0: 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72  structor->xDestr
86b0: 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  oy(pDestructor->
86c0: 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20  pUserData);.    
86d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
86e0: 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  db, pDestructor)
86f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8700: 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20  *.** Disconnect 
8710: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  all sqlite3_vtab
8720: 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65   objects that be
8730: 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  long to database
8740: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64   connection.** d
8750: 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  b. This is calle
8760: 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69  d when db is bei
8770: 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ng closed..*/.st
8780: 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e  atic void discon
8790: 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69  nectAllVtab(sqli
87a0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65  te3 *db){.#ifnde
87b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
87c0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74  RTUALTABLE.  int
87d0: 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   i;.  HashElem *
87e0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
87f0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
8800: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
8810: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53  nDb; i++){.    S
8820: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
8830: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
8840: 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 70 53 63  ema;.    if( pSc
8850: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f  hema ){.      fo
8860: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
8870: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
8880: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
8890: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
88a0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
88b0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
88c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
88d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
88e0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
88f0: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
8900: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
8910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8920: 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69    }.  for(p=sqli
8930: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
8940: 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d  >aModule); p; p=
8950: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
8960: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
8970: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
8980: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
8990: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  p);.    if( pMod
89a0: 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20 20 20  ->pEpoTab ){.   
89b0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 44 69     sqlite3VtabDi
89c0: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f  sconnect(db, pMo
89d0: 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20 20  d->pEpoTab);.   
89e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
89f0: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
8a00: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
8a10: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
8a20: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
8a30: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65  ARAMETER(db);.#e
8a40: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
8a50: 74 75 72 6e 20 54 52 55 45 20 69 66 20 64 61 74  turn TRUE if dat
8a60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8a70: 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69   db has unfinali
8a80: 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  zed prepared.** 
8a90: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
8aa0: 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33  finished sqlite3
8ab0: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e  _backup objects.
8ac0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
8ad0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
8ae0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
8af0: 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72    int j;.  asser
8b00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8b10: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
8b20: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   );.  if( db->pV
8b30: 64 62 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  dbe ) return 1;.
8b40: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
8b50: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
8b60: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8b70: 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[j].pBt;.   
8b80: 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69   if( pBt && sqli
8b90: 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b  te3BtreeIsInBack
8ba0: 75 70 28 70 42 74 29 20 29 20 72 65 74 75 72 6e  up(pBt) ) return
8bb0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
8bc0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
8bd0: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53  se an existing S
8be0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a  QLite database.*
8bf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
8c00: 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65  ite3Close(sqlite
8c10: 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65  3 *db, int force
8c20: 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21  Zombie){.  if( !
8c30: 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  db ){.    /* EVI
8c40: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35  DENCE-OF: R-6325
8c50: 37 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20  7-11740 Calling 
8c60: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8c70: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
8c80: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74  3_close_v2() wit
8c90: 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  h a NULL pointer
8ca0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68   argument is a h
8cb0: 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a  armless no-op. *
8cc0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
8cd0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
8ce0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
8cf0: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
8d00: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8d10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
8d20: 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
8d30: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
8d40: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
8d50: 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c  db->mTrace & SQL
8d60: 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20  ITE_TRACE_CLOSE 
8d70: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63  ){.    db->xTrac
8d80: 65 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43  e(SQLITE_TRACE_C
8d90: 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72 61 63 65  LOSE, db->pTrace
8da0: 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a 20 20 7d  Arg, db, 0);.  }
8db0: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69  ..  /* Force xDi
8dc0: 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f  sconnect calls o
8dd0: 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  n all virtual ta
8de0: 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e  bles */.  discon
8df0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b  nectAllVtab(db);
8e00: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
8e10: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
8e20: 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41   the disconnectA
8e30: 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62  llVtab() call ab
8e40: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
8e50: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
8e60: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
8e70: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
8e80: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
8e90: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
8ea0: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
8eb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
8ec0: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
8ed0: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
8ee0: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
8ef0: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
8f00: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
8f10: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
8f20: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
8f30: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
8f40: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
8f50: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
8f60: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
8f70: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
8f80: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
8f90: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8fa0: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ack(db);..  /* L
8fb0: 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28  egacy behavior (
8fc0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8fd0: 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20  behavior) is to 
8fe0: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
8ff0: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63  TE_BUSY if the c
9000: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f  onnection can no
9010: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
9020: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
9030: 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65  if( !forceZombie
9040: 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   && connectionIs
9050: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
9060: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
9070: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
9080: 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  USY, "unable to 
9090: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
90a0: 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20  inalized ".     
90b0: 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72    "statements or
90c0: 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b   unfinished back
90d0: 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ups");.    sqlit
90e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
90f0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
9100: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
9110: 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  Y;.  }..#ifdef S
9120: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
9130: 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
9140: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
9150: 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
9160: 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64  Closing the hand
9170: 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
9180: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
9190: 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20  he value 2. */. 
91a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
91b0: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73  Config.xSqllog(s
91c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
91d0: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64  ig.pSqllogArg, d
91e0: 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65  b, 0, 2);.  }.#e
91f0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  ndif..  /* Conve
9200: 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rt the connectio
9210: 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20  n into a zombie 
9220: 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  and then close i
9230: 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  t..  */.  db->ma
9240: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
9250: 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c  IC_ZOMBIE;.  sql
9260: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
9270: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29  dCloseZombie(db)
9280: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9290: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
92a0: 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e  wo variations on
92b0: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
92c0: 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e  rface for closin
92d0: 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
92e0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
92f0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
9300: 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20  version returns 
9310: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
9320: 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f  ** leaves the co
9330: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20  nnection option 
9340: 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66  if there are unf
9350: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
9360: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
9370: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
9380: 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20  lite3_backups.  
9390: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
93a0: 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f  e_v2().** versio
93b0: 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e  n forces the con
93c0: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d  nection to becom
93d0: 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68  e a zombie if th
93e0: 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f  ere are.** unclo
93f0: 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61  sed resources, a
9400: 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20  nd arranges for 
9410: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65  deallocation whe
9420: 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72  n the last.** pr
9430: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20  epare statement 
9440: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
9450: 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74  p closes..*/.int
9460: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
9470: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
9480: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
9490: 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71  (db,0); }.int sq
94a0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73  lite3_close_v2(s
94b0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
94c0: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
94d0: 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a  (db,1); }.../*.*
94e0: 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  * Close the mute
94f0: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f  x on database co
9500: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a  nnection db..**.
9510: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
9520: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
9530: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a  ection db is a z
9540: 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74  ombie (meaning t
9550: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73  hat there.** has
9560: 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61   been a prior ca
9570: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ll to sqlite3_cl
9580: 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74  ose(db) or sqlit
9590: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29  e3_close_v2(db))
95a0: 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71   and.** every sq
95b0: 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e  lite3_stmt has n
95c0: 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  ow been finalize
95d0: 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69  d and every sqli
95e0: 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a  te3_backup has.*
95f0: 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e  * finished, then
9600: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
9610: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
9620: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
9630: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c  dCloseZombie(sql
9640: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
9650: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9670: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
9680: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
9690: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
96a0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73  re outstanding s
96b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73  qlite3_stmt or s
96c0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
96d0: 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66  jects.  ** or if
96e0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
96f0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
9700: 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74   closed by sqlit
9710: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20  e3_close_v2(),. 
9720: 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65   ** then just le
9730: 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ave the mutex an
9740: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
9750: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d   if( db->magic!=
9760: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
9770: 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f  BIE || connectio
9780: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
9790: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
97a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
97b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
97c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
97d0: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
97e0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
97f0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
9800: 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20  ection has.  ** 
9810: 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74  closed all sqlit
9820: 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69  e3_stmt and sqli
9830: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
9840: 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a  ts and has been.
9850: 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73    ** passed to s
9860: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65  qlite3_close (me
9870: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  aning that it is
9880: 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65   a zombie).  The
9890: 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20  refore,.  ** go 
98a0: 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61  ahead and free a
98b0: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ll resources..  
98c0: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  */..  /* If a tr
98d0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
98e0: 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  n, roll it back.
98f0: 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72   This also ensur
9900: 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20  es that if.  ** 
9910: 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68  any database sch
9920: 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d  emas have been m
9930: 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e  odified by an un
9940: 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
9950: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20  ction.  ** they 
9960: 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74  are reset. And t
9970: 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64  hat the required
9980: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
9990: 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20   held to make.  
99a0: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c  ** the pager rol
99b0: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
99c0: 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63   reset an atomic
99d0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20   operation. */. 
99e0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
99f0: 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
9a00: 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61  K);..  /* Free a
9a10: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
9a20: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
9a30: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
9a40: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
9a50: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  (db);..  /* Clos
9a60: 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  e all database c
9a70: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
9a80: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
9a90: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
9aa0: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
9ab0: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
9ac0: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
9ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9ae0: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
9af0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
9b00: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
9b10: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
9b20: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
9b30: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
9b40: 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20  .  }.  /* Clear 
9b50: 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20  the TEMP schema 
9b60: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c  separately and l
9b70: 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ast */.  if( db-
9b80: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
9b90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63  ){.    sqlite3Sc
9ba0: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
9bb0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
9bc0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
9bd0: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
9be0: 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68  .  /* Free up th
9bf0: 65 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c  e array of auxil
9c00: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a  iary databases *
9c10: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  /.  sqlite3Colla
9c20: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
9c30: 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
9c40: 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20  db->nDb<=2 );.  
9c50: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d  assert( db->aDb=
9c60: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
9c70: 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65  ;..  /* Tell the
9c80: 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e   code in notify.
9c90: 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  c that the conne
9ca0: 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  ction no longer 
9cb0: 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c  holds any.  ** l
9cc0: 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f  ocks and does no
9cd0: 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75  t require any fu
9ce0: 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  rther unlock-not
9cf0: 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
9d00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e   */.  sqlite3Con
9d10: 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62  nectionClosed(db
9d20: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  );..  for(i=sqli
9d30: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9d40: 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71  >aFunc); i; i=sq
9d50: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
9d60: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
9d70: 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20  Next, *p;.    p 
9d80: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
9d90: 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  (i);.    do{.   
9da0: 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72     functionDestr
9db0: 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  oy(db, p);.     
9dc0: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
9dd0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
9de0: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
9df0: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
9e00: 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b      }while( p );
9e10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
9e20: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75  shClear(&db->aFu
9e30: 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  nc);.  for(i=sql
9e40: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9e50: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
9e60: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
9e70: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
9e80: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
9e90: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
9ea0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
9eb0: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
9ec0: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
9ed0: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
9ee0: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
9ef0: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
9f00: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
9f10: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
9f20: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
9f30: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
9f40: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
9f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9f60: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9f70: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
9f80: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
9f90: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
9fa0: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
9fb0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9fc0: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
9fd0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9fe0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
9ff0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
a000: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
a010: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
a020: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
a030: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
a040: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
a050: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
a060: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
a070: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a080: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
a090: 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d  ableClear(db, pM
a0a0: 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  od);.    sqlite3
a0b0: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
a0c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
a0d0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
a0e0: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
a0f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
a100: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f  b, SQLITE_OK); /
a110: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
a120: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
a130: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
a140: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
a150: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
a160: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
a170: 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54  s(db);.#if SQLIT
a180: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
a190: 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f  ATION.  sqlite3_
a1a0: 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41  free(db->auth.zA
a1b0: 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69  uthUser);.  sqli
a1c0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74  te3_free(db->aut
a1d0: 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64  h.zAuthPW);.#end
a1e0: 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  if..  db->magic 
a1f0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
a200: 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  RROR;..  /* The 
a210: 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63  temp-database sc
a220: 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  hema is allocate
a230: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  d differently fr
a240: 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68  om the other sch
a250: 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ema.  ** objects
a260: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61   (using sqliteMa
a270: 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c  lloc() directly,
a280: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
a290: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29  te3BtreeSchema()
a2a0: 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65  )..  ** So it ne
a2b0: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
a2c0: 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20  here. Todo: Why 
a2d0: 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d  not roll the tem
a2e0: 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20  p schema into.  
a2f0: 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69  ** the same sqli
a300: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68  teMalloc() as th
a310: 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63  e one that alloc
a320: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
a330: 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  e .  ** structur
a340: 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e?.  */.  sqlite
a350: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
a360: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
a370: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a380: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a390: 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  );.  db->magic =
a3a0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
a3b0: 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OSED;.  sqlite3_
a3c0: 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d  mutex_free(db->m
a3d0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
a3e0: 20 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64   sqlite3Lookasid
a3f0: 65 55 73 65 64 28 64 62 2c 30 29 3d 3d 30 20 29  eUsed(db,0)==0 )
a400: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  ;.  if( db->look
a410: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
a420: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
a430: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
a440: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
a450: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a460: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
a470: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
a480: 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69  e files.  If tri
a490: 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
a4a0: 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20  ITE_OK, then.** 
a4b0: 61 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  any write cursor
a4c0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
a4d0: 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61  d ("tripped" - a
a4e0: 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61  s in "tripping a
a4f0: 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61   circuit.** brea
a500: 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74  ker") and made t
a510: 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64  o return tripCod
a520: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
a530: 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74  ny further.** at
a540: 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68  tempts to use th
a550: 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64  at cursor.  Read
a560: 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20   cursors remain 
a570: 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a  open and valid.*
a580: 2a 20 62 75 74 20 61 72 65 20 22 73 61 76 65 64  * but are "saved
a590: 22 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 61  " in case the ta
a5a0: 62 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f  ble pages are mo
a5b0: 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76  ved around..*/.v
a5c0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
a5d0: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
a5e0: 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  db, int tripCode
a5f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
a600: 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  t inTrans = 0;. 
a610: 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67   int schemaChang
a620: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
a630: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
a640: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
a650: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
a660: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f  gnMalloc();..  /
a670: 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74  * Obtain all b-t
a680: 72 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f  ree mutexes befo
a690: 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61  re making any ca
a6a0: 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c  lls to BtreeRoll
a6b0: 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68  back(). .  ** Th
a6c0: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
a6d0: 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e  in case the tran
a6e0: 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f  saction being ro
a6f0: 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20  lled back has.  
a700: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ** modified the 
a710: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
a720: 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d   If the b-tree m
a730: 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74  utexes are not t
a740: 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20  aken.  ** here, 
a750: 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61  then another sha
a760: 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63  red-cache connec
a770: 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b  tion might sneak
a780: 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a   in between.  **
a790: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f   the database ro
a7a0: 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d  llback and schem
a7b0: 61 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63  a reset, which c
a7c0: 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20  an cause false. 
a7d0: 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72   ** corruption r
a7e0: 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63  eports in some c
a7f0: 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69  ases.  */.  sqli
a800: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
a810: 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68  (db);.  schemaCh
a820: 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44 62 46  ange = (db->mDbF
a830: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63  lags & DBFLAG_Sc
a840: 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30 20 26  hemaChange)!=0 &
a850: 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
a860: 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  =0;..  for(i=0; 
a870: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a880: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
a890: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
a8a0: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
a8b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
a8c0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20  reeIsInTrans(p) 
a8d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
a8e0: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
a8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
a900: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72  eeRollback(p, tr
a910: 69 70 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43  ipCode, !schemaC
a920: 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hange);.    }.  
a930: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  }.  sqlite3VtabR
a940: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73  ollback(db);.  s
a950: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
a960: 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20  alloc();..  if( 
a970: 73 63 68 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a  schemaChange ){.
a980: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
a990: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
a9a0: 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  nts(db, 0);.    
a9b0: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
a9c0: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
a9d0: 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  on(db);.  }.  sq
a9e0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
a9f0: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e  ll(db);..  /* An
aa00: 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  y deferred const
aa10: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
aa20: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
aa30: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62  esolved. */.  db
aa40: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
aa50: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65  = 0;.  db->nDefe
aa60: 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b  rredImmCons = 0;
aa70: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
aa80: 7e 28 75 36 34 29 53 51 4c 49 54 45 5f 44 65 66  ~(u64)SQLITE_Def
aa90: 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  erFKs;..  /* If 
aaa0: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
aab0: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
aac0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
aad0: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
aae0: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
aaf0: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
ab00: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
ab10: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
ab20: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
ab30: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
ab40: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
ab50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ab60: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f  static string co
ab70: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
ab80: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
ab90: 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  to the error cod
aba0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69  e.** specified i
abb0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
abc0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
abd0: 51 4c 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e  QLITE_NEED_ERR_N
abe0: 41 4d 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20  AME).const char 
abf0: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
ac00: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
ac10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
ac20: 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52  ;.  int i, origR
ac30: 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  c = rc;.  for(i=
ac40: 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d  0; i<2 && zName=
ac50: 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30  =0; i++, rc &= 0
ac60: 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68  xff){.    switch
ac70: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
ac80: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
aca0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
acb0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
acc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
acd0: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
ace0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
acf0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
ad00: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
ad10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ad20: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
ad30: 52 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20  R_SNAPSHOT:     
ad40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ad50: 45 52 52 4f 52 5f 53 4e 41 50 53 48 4f 54 22 3b  ERROR_SNAPSHOT";
ad60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ad70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
ad80: 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20  ERNAL:          
ad90: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ada0: 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20  _INTERNAL";     
adb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
adc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
add0: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
ade0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
adf0: 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20  E_PERM";        
ae00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ae10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
ae20: 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20  BORT:           
ae30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ae40: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
ae50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ae60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ae70: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20  ABORT_ROLLBACK: 
ae80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ae90: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
aea0: 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  CK";    break;. 
aeb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
aec0: 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20  _BUSY:          
aed0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
aee0: 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20  LITE_BUSY";     
aef0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
af00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
af10: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a  E_BUSY_RECOVERY:
af20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
af30: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
af40: 45 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ERY";     break;
af50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
af60: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
af70: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
af80: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
af90: 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  SHOT";     break
afa0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
afb0: 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
afc0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
afd0: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b  "SQLITE_LOCKED";
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
aff0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b000: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
b010: 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d  EDCACHE: zName =
b020: 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f   "SQLITE_LOCKED_
b030: 53 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65  SHAREDCACHE";bre
b040: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b050: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
b060: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b070: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  = "SQLITE_NOMEM"
b080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
b090: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b0a0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a  SQLITE_READONLY:
b0b0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b0c0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
b0d0: 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62  NLY";          b
b0e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b0f0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
b100: 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d  _RECOVERY:  zNam
b110: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b120: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
b130: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b140: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
b150: 59 5f 43 41 4e 54 49 4e 49 54 3a 20 20 7a 4e 61  Y_CANTINIT:  zNa
b160: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
b170: 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 22 3b  DONLY_CANTINIT";
b180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b190: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
b1a0: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e  LY_ROLLBACK:  zN
b1b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
b1c0: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22  ADONLY_ROLLBACK"
b1d0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
b1e0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
b1f0: 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a  NLY_DBMOVED:   z
b200: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
b210: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22  EADONLY_DBMOVED"
b220: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
b230: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
b240: 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 3a 20  ONLY_DIRECTORY: 
b250: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b260: 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f  READONLY_DIRECTO
b270: 52 59 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  RY";break;.     
b280: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
b290: 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20  ERRUPT:         
b2a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b2b0: 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20  _INTERRUPT";    
b2c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b2d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b2e0: 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ERR:            
b2f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b300: 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20  E_IOERR";       
b310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b320: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b330: 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20  OERR_READ:      
b340: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b350: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20  TE_IOERR_READ"; 
b360: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b370: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b380: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
b390: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
b3a0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
b3b0: 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  READ";  break;. 
b3c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b3d0: 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20  _IOERR_WRITE:   
b3e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b3f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
b400: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b410: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b420: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20  E_IOERR_FSYNC:  
b430: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b440: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
b450: 43 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  C";       break;
b460: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b470: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
b480: 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  NC:    zName = "
b490: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b4a0: 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b  _FSYNC";   break
b4b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b4c0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
b4d0: 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TE:     zName = 
b4e0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  "SQLITE_IOERR_TR
b4f0: 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61  UNCATE";    brea
b500: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b510: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
b520: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
b530: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46   "SQLITE_IOERR_F
b540: 53 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65  STAT";       bre
b550: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b560: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b570: 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  CK:       zName 
b580: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b590: 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72  UNLOCK";      br
b5a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b5b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
b5c0: 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  OCK:       zName
b5d0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b5e0: 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62  _RDLOCK";      b
b5f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b600: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
b610: 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LETE:       zNam
b620: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b630: 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20  R_DELETE";      
b640: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b650: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  e SQLITE_IOERR_N
b660: 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61  OMEM:        zNa
b670: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b680: 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  RR_NOMEM";      
b690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b6a0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b6b0: 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e  ACCESS:       zN
b6c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b6d0: 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20  ERR_ACCESS";    
b6e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b6f0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b700: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
b710: 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK:.            
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b740: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
b750: 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72  ESERVEDLOCK"; br
b760: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b770: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
b780: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
b790: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b7a0: 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62  _LOCK";        b
b7b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b7c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
b7d0: 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  OSE:        zNam
b7e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b7f0: 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20  R_CLOSE";       
b800: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b810: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
b820: 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61  IR_CLOSE:    zNa
b830: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b840: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20  RR_DIR_CLOSE";  
b850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b860: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b870: 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e  SHMOPEN:      zN
b880: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b890: 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20  ERR_SHMOPEN";   
b8a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b8b0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b8c0: 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a  _SHMSIZE:      z
b8d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b8e0: 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20  OERR_SHMSIZE";  
b8f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b900: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b910: 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20  R_SHMLOCK:      
b920: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b930: 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20  IOERR_SHMLOCK"; 
b940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b950: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b960: 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20  RR_SHMMAP:      
b970: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b980: 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20  _IOERR_SHMMAP"; 
b990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b9a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b9b0: 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20  ERR_SEEK:       
b9c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b9d0: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20  E_IOERR_SEEK";  
b9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b9f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ba00: 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
ba10: 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  T: zName = "SQLI
ba20: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
ba30: 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20  NOENT";break;.  
ba40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ba50: 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20  IOERR_MMAP:     
ba60: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ba70: 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b  ITE_IOERR_MMAP";
ba80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ba90: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
baa0: 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
bab0: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
bac0: 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
bad0: 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  MPPATH"; break;.
bae0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
baf0: 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
bb00: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
bb10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
bb20: 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b  PATH";    break;
bb30: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bb40: 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20  TE_CORRUPT:     
bb50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bb60: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b  SQLITE_CORRUPT";
bb70: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bb80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bb90: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
bba0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
bbb0: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  "SQLITE_CORRUPT_
bbc0: 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61  VTAB";      brea
bbd0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bbe0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20  LITE_NOTFOUND:  
bbf0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bc00: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e   "SQLITE_NOTFOUN
bc10: 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  D";          bre
bc20: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bc30: 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20  QLITE_FULL:     
bc40: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bc50: 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b  = "SQLITE_FULL";
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
bc70: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bc80: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a  SQLITE_CANTOPEN:
bc90: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bca0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
bcb0: 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62  PEN";          b
bcc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bcd0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bce0: 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d  _NOTEMPDIR: zNam
bcf0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bd00: 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b  OPEN_NOTEMPDIR";
bd10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bd20: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
bd30: 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61  N_ISDIR:     zNa
bd40: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
bd50: 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20  TOPEN_ISDIR";   
bd60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bd70: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
bd80: 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e  EN_FULLPATH:  zN
bd90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
bda0: 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22  NTOPEN_FULLPATH"
bdb0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
bdc0: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
bdd0: 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a  PEN_CONVPATH:  z
bde0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bdf0: 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
be00: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
be10: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54  case SQLITE_PROT
be20: 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20  OCOL:           
be30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
be40: 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20  PROTOCOL";      
be50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
be60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50   case SQLITE_EMP
be70: 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TY:             
be80: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
be90: 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20  _EMPTY";        
bea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
beb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43    case SQLITE_SC
bec0: 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20  HEMA:           
bed0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bee0: 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20  E_SCHEMA";      
bef0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
bf10: 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20  OOBIG:          
bf20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bf30: 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20  TE_TOOBIG";     
bf40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bf50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bf60: 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20  CONSTRAINT:     
bf70: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bf80: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b  ITE_CONSTRAINT";
bf90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bfa0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bfb0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
bfc0: 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  UE:  zName = "SQ
bfd0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bfe0: 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a  UNIQUE"; break;.
bff0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c000: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
c010: 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  GGER: zName = "S
c020: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c030: 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b  _TRIGGER";break;
c040: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c050: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
c060: 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20  REIGNKEY:.      
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c090: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c0a0: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22  AINT_FOREIGNKEY"
c0b0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
c0c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c0d0: 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20  STRAINT_CHECK:  
c0e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c0f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43  _CONSTRAINT_CHEC
c100: 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  K";  break;.    
c110: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c120: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
c130: 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20  KEY:.           
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c160: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c170: 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62  PRIMARYKEY";   b
c180: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c190: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c1a0: 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d  NT_NOTNULL: zNam
c1b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
c1c0: 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b  TRAINT_NOTNULL";
c1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c1e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c1f0: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a  INT_COMMITHOOK:.
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c230: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
c240: 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b  THOOK";   break;
c250: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c260: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54  TE_CONSTRAINT_VT
c270: 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  AB:    zName = "
c280: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c290: 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b  T_VTAB";   break
c2a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c2b0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
c2c0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20  UNCTION:.       
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c2f0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
c300: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20  INT_FUNCTION";  
c310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c320: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
c330: 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20  TRAINT_ROWID:   
c340: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c350: 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44  CONSTRAINT_ROWID
c360: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
c370: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
c380: 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20  MATCH:          
c390: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c3a0: 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20  _MISMATCH";     
c3b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c3c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
c3d0: 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20  SUSE:           
c3e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c3f0: 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20  E_MISUSE";      
c400: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c410: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c420: 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20  OLFS:           
c430: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c440: 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20  TE_NOLFS";      
c450: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c460: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c470: 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20  AUTH:           
c480: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c490: 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20  ITE_AUTH";      
c4a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c4b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c4c0: 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20  _FORMAT:        
c4d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c4e0: 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20  LITE_FORMAT";   
c4f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c500: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c510: 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20  E_RANGE:        
c520: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c530: 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20  QLITE_RANGE";   
c540: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c550: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c560: 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20  TE_NOTADB:      
c570: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c580: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20  SQLITE_NOTADB"; 
c590: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c5a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c5b0: 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20  ITE_ROW:        
c5c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c5d0: 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20  "SQLITE_ROW";   
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c5f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c600: 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20  LITE_NOTICE:    
c610: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c620: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22   "SQLITE_NOTICE"
c630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
c640: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c650: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
c660: 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20  OVER_WAL: zName 
c670: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
c680: 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72  _RECOVER_WAL";br
c690: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c6a0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
c6b0: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a  COVER_ROLLBACK:.
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c6f0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
c700: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
c710: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c720: 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20  TE_WARNING:     
c730: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c740: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b  SQLITE_WARNING";
c750: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c760: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c770: 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f  ITE_WARNING_AUTO
c780: 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20  INDEX:  zName = 
c790: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  "SQLITE_WARNING_
c7a0: 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61  AUTOINDEX"; brea
c7b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c7c0: 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20  LITE_DONE:      
c7d0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c7e0: 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20   "SQLITE_DONE"; 
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
c800: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
c810: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
c820: 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
c830: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71  zBuf[50];.    sq
c840: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
c850: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
c860: 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f  f, "SQLITE_UNKNO
c870: 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29  WN(%d)", origRc)
c880: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42  ;.    zName = zB
c890: 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  uf;.  }.  return
c8a0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
c8b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
c8c0: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74   static string t
c8d0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
c8e0: 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
c8f0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
c900: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
c910: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
c920: 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72  ite3ErrStr(int r
c930: 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  c){.  static con
c940: 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61  st char* const a
c950: 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  Msg[] = {.    /*
c960: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
c970: 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65      */ "not an e
c980: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
c990: 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20  LITE_ERROR      
c9a0: 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65   */ "SQL logic e
c9b0: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
c9c0: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20  LITE_INTERNAL   
c9d0: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
c9e0: 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20  LITE_PERM       
c9f0: 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d   */ "access perm
ca00: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  ission denied",.
ca10: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42      /* SQLITE_AB
ca20: 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 71 75  ORT       */ "qu
ca30: 65 72 79 20 61 62 6f 72 74 65 64 22 2c 0a 20 20  ery aborted",.  
ca40: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    /* SQLITE_BUSY
ca50: 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61          */ "data
ca60: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c  base is locked",
ca70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  .    /* SQLITE_L
ca80: 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64  OCKED      */ "d
ca90: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
caa0: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
cab0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20   SQLITE_NOMEM   
cac0: 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d      */ "out of m
cad0: 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53  emory",.    /* S
cae0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20  QLITE_READONLY  
caf0: 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f    */ "attempt to
cb00: 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c   write a readonl
cb10: 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20  y database",.   
cb20: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   /* SQLITE_INTER
cb30: 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72  RUPT   */ "inter
cb40: 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20  rupted",.    /* 
cb50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20  SQLITE_IOERR    
cb60: 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20     */ "disk I/O 
cb70: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
cb80: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20  QLITE_CORRUPT   
cb90: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64    */ "database d
cba0: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
cbb0: 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20  formed",.    /* 
cbc0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
cbd0: 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f     */ "unknown o
cbe0: 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f  peration",.    /
cbf0: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20  * SQLITE_FULL   
cc00: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
cc10: 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c  e or disk is ful
cc20: 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  l",.    /* SQLIT
cc30: 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f  E_CANTOPEN    */
cc40: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
cc50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c   database file",
cc60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
cc70: 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c  ROTOCOL    */ "l
cc80: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22  ocking protocol"
cc90: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cca0: 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 30  EMPTY       */ 0
ccb0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
ccc0: 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22  SCHEMA      */ "
ccd0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
cce0: 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20  has changed",.  
ccf0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42    /* SQLITE_TOOB
cd00: 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69  IG      */ "stri
cd10: 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62  ng or blob too b
cd20: 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ig",.    /* SQLI
cd30: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a  TE_CONSTRAINT  *
cd40: 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  / "constraint fa
cd50: 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  iled",.    /* SQ
cd60: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20  LITE_MISMATCH   
cd70: 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69   */ "datatype mi
cd80: 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20  smatch",.    /* 
cd90: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20  SQLITE_MISUSE   
cda0: 20 20 20 2a 2f 20 22 62 61 64 20 70 61 72 61 6d     */ "bad param
cdb0: 65 74 65 72 20 6f 72 20 6f 74 68 65 72 20 41 50  eter or other AP
cdc0: 49 20 6d 69 73 75 73 65 22 2c 0a 23 69 66 64 65  I misuse",.#ifde
cdd0: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
cde0: 5f 4c 46 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49  _LFS.    /* SQLI
cdf0: 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a  TE_NOLFS       *
ce00: 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75  / "large file su
ce10: 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65  pport is disable
ce20: 64 22 2c 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a  d",.#else.    /*
ce30: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20   SQLITE_NOLFS   
ce40: 20 20 20 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66      */ 0,.#endif
ce50: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
ce60: 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61  UTH        */ "a
ce70: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e  uthorization den
ce80: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
ce90: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20  ITE_FORMAT      
cea0: 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  */ 0,.    /* SQL
ceb0: 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20  ITE_RANGE       
cec0: 2a 2f 20 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  */ "column index
ced0: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a   out of range",.
cee0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
cef0: 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69  TADB      */ "fi
cf00: 6c 65 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61  le is not a data
cf10: 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  base",.    /* SQ
cf20: 4c 49 54 45 5f 4e 4f 54 49 43 45 20 20 20 20 20  LITE_NOTICE     
cf30: 20 2a 2f 20 22 6e 6f 74 69 66 69 63 61 74 69 6f   */ "notificatio
cf40: 6e 20 6d 65 73 73 61 67 65 22 2c 0a 20 20 20 20  n message",.    
cf50: 2f 2a 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  /* SQLITE_WARNIN
cf60: 47 20 20 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e  G     */ "warnin
cf70: 67 20 6d 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b  g message",.  };
cf80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
cf90: 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65  Err = "unknown e
cfa0: 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28  rror";.  switch(
cfb0: 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20   rc ){.    case 
cfc0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
cfd0: 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a  LBACK: {.      z
cfe0: 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65  Err = "abort due
cff0: 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   to ROLLBACK";. 
d000: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d010: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
d020: 45 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a  E_ROW: {.      z
d030: 45 72 72 20 3d 20 22 61 6e 6f 74 68 65 72 20 72  Err = "another r
d040: 6f 77 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20  ow available";. 
d050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d060: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
d070: 45 5f 44 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20  E_DONE: {.      
d080: 7a 45 72 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20  zErr = "no more 
d090: 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 22 3b  rows available";
d0a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d0b0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
d0c0: 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30   {.      rc &= 0
d0d0: 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41  xff;.      if( A
d0e0: 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20  LWAYS(rc>=0) && 
d0f0: 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73  rc<ArraySize(aMs
d100: 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d  g) && aMsg[rc]!=
d110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72  0 ){.        zEr
d120: 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20  r = aMsg[rc];.  
d130: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d140: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
d150: 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f  eturn zErr;.}../
d160: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62  e implements a b
d180: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61  usy callback tha
d190: 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69  t sleeps and tri
d1a0: 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69  es.** again unti
d1b0: 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  l a timeout valu
d1c0: 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54  e is reached.  T
d1d0: 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65  he timeout value
d1e0: 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65   is.** an intege
d1f0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
d200: 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20  iseconds passed 
d210: 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  in as the first.
d220: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
d230: 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
d240: 72 6f 20 74 6f 20 72 65 74 72 79 20 74 68 65 20  ro to retry the 
d250: 6c 6f 63 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65  lock.  Return ze
d260: 72 6f 20 74 6f 20 73 74 6f 70 20 74 72 79 69 6e  ro to stop tryin
d270: 67 0a 2a 2a 20 61 6e 64 20 63 61 75 73 65 20 53  g.** and cause S
d280: 51 4c 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20  QLite to return 
d290: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a  SQLITE_BUSY..*/.
d2a0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
d2b0: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
d2c0: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74  back(.  void *pt
d2d0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
d2e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
d2f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
d300: 20 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20   count,         
d310: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d320: 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68  of times table h
d330: 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a  as been busy */.
d340: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
d350: 70 46 69 6c 65 20 20 20 20 20 20 2f 2a 20 54 68  pFile      /* Th
d360: 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20  e file on which 
d370: 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65  the lock occurre
d380: 64 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49  d */.){.#if SQLI
d390: 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56  TE_OS_WIN || HAV
d3a0: 45 5f 55 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68  E_USLEEP.  /* Th
d3b0: 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 73  is case is for s
d3c0: 79 73 74 65 6d 73 20 74 68 61 74 20 68 61 76 65  ystems that have
d3d0: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 73 6c 65   support for sle
d3e0: 65 70 69 6e 67 20 66 6f 72 20 66 72 61 63 74 69  eping for fracti
d3f0: 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65  ons of.  ** a se
d400: 63 6f 6e 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a  cond.  Examples:
d410: 20 20 41 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79    All windows sy
d420: 73 74 65 6d 73 2c 20 75 6e 69 78 20 73 79 73 74  stems, unix syst
d430: 65 6d 73 20 77 69 74 68 20 75 73 6c 65 65 70 28  ems with usleep(
d440: 29 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  ) */.  static co
d450: 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20  nst u8 delays[] 
d460: 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35  =.     { 1, 2, 5
d470: 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35  , 10, 15, 20, 25
d480: 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20  , 25,  25,  50, 
d490: 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74   50, 100 };.  st
d4a0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f  atic const u8 to
d4b0: 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  tals[] =.     { 
d4c0: 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c  0, 1, 3,  8, 18,
d4d0: 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33   33, 53, 78, 103
d4e0: 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20  , 128, 178, 228 
d4f0: 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c  };.# define NDEL
d500: 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c  AY ArraySize(del
d510: 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  ays).  sqlite3 *
d520: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
d530: 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74  ptr;.  int tmout
d540: 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f   = db->busyTimeo
d550: 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c  ut;.  int delay,
d560: 20 70 72 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20   prior;..#ifdef 
d570: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
d580: 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66  TLK_TIMEOUT.  if
d590: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  ( sqlite3OsFileC
d5a0: 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c  ontrol(pFile,SQL
d5b0: 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54  ITE_FCNTL_LOCK_T
d5c0: 49 4d 45 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d  IMEOUT,&tmout)==
d5d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d5e0: 20 69 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20   if( count ){.  
d5f0: 20 20 20 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20      tmout = 0;. 
d600: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69       sqlite3OsFi
d610: 6c 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c  leControl(pFile,
d620: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
d630: 43 4b 5f 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f  CK_TIMEOUT, &tmo
d640: 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
d650: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
d660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
d670: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
d680: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d690: 45 52 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  ER(pFile);.#endi
d6a0: 66 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  f.  assert( coun
d6b0: 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f  t>=0 );.  if( co
d6c0: 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a  unt < NDELAY ){.
d6d0: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
d6e0: 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70  ys[count];.    p
d6f0: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f  rior = totals[co
d700: 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unt];.  }else{. 
d710: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
d720: 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20  s[NDELAY-1];.   
d730: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
d740: 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61  NDELAY-1] + dela
d750: 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59  y*(count-(NDELAY
d760: 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  -1));.  }.  if( 
d770: 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20  prior + delay > 
d780: 74 6d 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c  tmout ){.    del
d790: 61 79 20 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69  ay = tmout - pri
d7a0: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
d7b0: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
d7c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
d7d0: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
d7e0: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
d7f0: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
d800: 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 66 6f   /* This case fo
d810: 72 20 75 6e 69 78 20 73 79 73 74 65 6d 73 20 74  r unix systems t
d820: 68 61 74 20 6c 61 63 6b 20 75 73 6c 65 65 70 28  hat lack usleep(
d830: 29 20 73 75 70 70 6f 72 74 2e 20 20 53 6c 65 65  ) support.  Slee
d840: 70 69 6e 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62  ping.  ** must b
d850: 65 20 64 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d  e done in increm
d860: 65 6e 74 73 20 6f 66 20 77 68 6f 6c 65 20 73 65  ents of whole se
d870: 63 6f 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74  conds */.  sqlit
d880: 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65  e3 *db = (sqlite
d890: 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74  3 *)ptr;.  int t
d8a0: 6d 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33  mout = ((sqlite3
d8b0: 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d   *)ptr)->busyTim
d8c0: 65 6f 75 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50  eout;.  UNUSED_P
d8d0: 41 52 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b  ARAMETER(pFile);
d8e0: 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29  .  if( (count+1)
d8f0: 2a 31 30 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b  *1000 > tmout ){
d900: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d910: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
d920: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30  eep(db->pVfs, 10
d930: 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  00000);.  return
d940: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
d950: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67  .** Invoke the g
d960: 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65  iven busy handle
d970: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
d980: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
d990: 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f  when an operatio
d9a0: 6e 20 66 61 69 6c 65 64 20 74 6f 20 61 63 71 75  n failed to acqu
d9b0: 69 72 65 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ire a.** lock on
d9c0: 20 56 46 53 20 66 69 6c 65 20 70 46 69 6c 65 2e   VFS file pFile.
d9d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  .**.** If this r
d9e0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
d9f0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
da00: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
da10: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
da20: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
da30: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
da40: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
da50: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
da60: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
da70: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
da80: 70 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  p, sqlite3_file 
da90: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
daa0: 63 3b 0a 20 20 69 66 28 20 70 2d 3e 78 42 75 73  c;.  if( p->xBus
dab0: 79 48 61 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70  yHandler==0 || p
dac0: 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75  ->nBusy<0 ) retu
dad0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62  rn 0;.  if( p->b
dae0: 45 78 74 72 61 46 69 6c 65 41 72 67 20 29 7b 0a  ExtraFileArg ){.
daf0: 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 78      /* Add an ex
db00: 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 77 69  tra parameter wi
db10: 74 68 20 74 68 65 20 70 46 69 6c 65 20 70 6f 69  th the pFile poi
db20: 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 64 20  nter to the end 
db30: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
db40: 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20  llback argument 
db50: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  list */.    int 
db60: 28 2a 78 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e  (*xTra)(void*,in
db70: 74 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  t,sqlite3_file*)
db80: 3b 0a 20 20 20 20 78 54 72 61 20 3d 20 28 69 6e  ;.    xTra = (in
db90: 74 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73  t(*)(void*,int,s
dba0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d  qlite3_file*))p-
dbb0: 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  >xBusyHandler;. 
dbc0: 20 20 20 72 63 20 3d 20 78 54 72 61 28 70 2d 3e     rc = xTra(p->
dbd0: 70 42 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75  pBusyArg, p->nBu
dbe0: 73 79 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65  sy, pFile);.  }e
dbf0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61  lse{.    /* Lega
dc00: 63 79 20 73 74 79 6c 65 20 62 75 73 79 20 68 61  cy style busy ha
dc10: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a  ndler callback *
dc20: 2f 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 78 42  /.    rc = p->xB
dc30: 75 73 79 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42  usyHandler(p->pB
dc40: 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  usyArg, p->nBusy
dc50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
dc60: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  =0 ){.    p->nBu
dc70: 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  sy = -1;.  }else
dc80: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b  {.    p->nBusy++
dc90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
dca0: 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c; .}../*.** Thi
dcb0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
dcc0: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
dcd0: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
dce0: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
dcf0: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
dd00: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
dd10: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
dd20: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
dd30: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a  3_busy_handler(.
dd40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
dd50: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
dd60: 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  id*,int),.  void
dd70: 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66   *pArg.){.#ifdef
dd80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
dd90: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
dda0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
ddb0: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
ddc0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
ddd0: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
dde0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ddf0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
de00: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
de10: 2e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  .xBusyHandler = 
de20: 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73  xBusy;.  db->bus
de30: 79 48 61 6e 64 6c 65 72 2e 70 42 75 73 79 41 72  yHandler.pBusyAr
de40: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
de50: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
de60: 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73  y = 0;.  db->bus
de70: 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46  yHandler.bExtraF
de80: 69 6c 65 41 72 67 20 3d 20 30 3b 0a 20 20 64 62  ileArg = 0;.  db
de90: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
dea0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
deb0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
dec0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
ded0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
dee0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
def0: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
df00: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
df10: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
df20: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
df30: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
df40: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
df50: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
df60: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
df70: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
df80: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
df90: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
dfa0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
dfb0: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
dfc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
dfd0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
dfe0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
dff0: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
e000: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
e010: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
e020: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
e030: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e040: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
e050: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
e060: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
e070: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e080: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e090: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
e0a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e0b0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
e0c0: 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29  ;.  if( nOps>0 )
e0d0: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
e0e0: 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b  ess = xProgress;
e0f0: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
e100: 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65  ssOps = (unsigne
e110: 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e  d)nOps;.    db->
e120: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70  pProgressArg = p
e130: 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Arg;.  }else{.  
e140: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
e150: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  = 0;.    db->nPr
e160: 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20  ogressOps = 0;. 
e170: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
e180: 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  Arg = 0;.  }.  s
e190: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e1a0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ve(db->mutex);.}
e1b0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
e1c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73  This routine ins
e1d0: 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20  talls a default 
e1e0: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61  busy handler tha
e1f0: 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a  t waits for the.
e200: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
e210: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
e220: 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nds before retur
e230: 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  ning 0..*/.int s
e240: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
e250: 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  out(sqlite3 *db,
e260: 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66   int ms){.#ifdef
e270: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e280: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e290: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
e2a0: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
e2b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
e2c0: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69  BKPT;.#endif.  i
e2d0: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73  f( ms>0 ){.    s
e2e0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
e2f0: 6c 65 72 28 64 62 2c 20 28 69 6e 74 28 2a 29 28  ler(db, (int(*)(
e300: 76 6f 69 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74  void*,int))sqlit
e310: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
e320: 62 61 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  back,.          
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20     (void*)db);. 
e350: 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f     db->busyTimeo
e360: 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d  ut = ms;.    db-
e370: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 62 45 78  >busyHandler.bEx
e380: 74 72 61 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a  traFileArg = 1;.
e390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
e3a0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
e3b0: 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  r(db, 0, 0);.  }
e3c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e3d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
e3e0: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
e3f0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
e400: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
e410: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
e420: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  /.void sqlite3_i
e430: 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33  nterrupt(sqlite3
e440: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
e450: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e460: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
e470: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
e480: 6b 28 64 62 29 20 26 26 20 28 64 62 3d 3d 30 20  k(db) && (db==0 
e490: 7c 7c 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51  || db->magic!=SQ
e4a0: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
e4b0: 45 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  E) ){.    (void)
e4c0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e4d0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
e4e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d    }.#endif.  db-
e4f0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
e500: 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d = 1;.}.../*.**
e510: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
e520: 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  s exactly the sa
e530: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72  me as sqlite3_cr
e540: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
e550: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
e560: 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  it is designed t
e570: 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69  o be called by i
e580: 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68  nternal code. Th
e590: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a  e difference is.
e5a0: 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c  ** that if a mal
e5b0: 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73  loc() fails in s
e5c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e5d0: 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72  nction(), an err
e5e0: 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65  or code.** is re
e5f0: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d  turned and the m
e600: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
e610: 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e   cleared. .*/.in
e620: 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  t sqlite3CreateF
e630: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  unc(.  sqlite3 *
e640: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
e650: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
e660: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
e670: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
e680: 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69  pUserData,.  voi
e690: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
e6a0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e6b0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e6c0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
e6d0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
e6e0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e6f0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e700: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
e710: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
e720: 20 20 76 6f 69 64 20 28 2a 78 56 61 6c 75 65 29    void (*xValue)
e730: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e740: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e  *),.  void (*xIn
e750: 76 65 72 73 65 29 28 73 71 6c 69 74 65 33 5f 63  verse)(sqlite3_c
e760: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
e770: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
e780: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
e790: 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a  *pDestructor.){.
e7a0: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20    FuncDef *p;.  
e7b0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74  int nName;.  int
e7c0: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20   extraFlags;..  
e7d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e7e0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
e7f0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
e800: 74 28 20 78 56 61 6c 75 65 3d 3d 30 20 7c 7c 20  t( xValue==0 || 
e810: 78 53 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 69  xSFunc==0 );.  i
e820: 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  f( zFunctionName
e830: 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
e840: 20 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20     /* Must have 
e850: 61 20 76 61 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a  a valid name */.
e860: 20 20 20 7c 7c 20 28 78 53 46 75 6e 63 21 3d 30     || (xSFunc!=0
e870: 20 26 26 20 78 46 69 6e 61 6c 21 3d 30 29 20 20   && xFinal!=0)  
e880: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 62 6f 74        /* Not bot
e890: 68 20 78 53 46 75 6e 63 20 61 6e 64 20 78 46 69  h xSFunc and xFi
e8a0: 6e 61 6c 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78  nal */.   || ((x
e8b0: 46 69 6e 61 6c 3d 3d 30 29 21 3d 28 78 53 74 65  Final==0)!=(xSte
e8c0: 70 3d 3d 30 29 29 20 20 20 20 20 20 20 2f 2a 20  p==0))       /* 
e8d0: 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20  Both or neither 
e8e0: 6f 66 20 78 46 69 6e 61 6c 20 61 6e 64 20 78 53  of xFinal and xS
e8f0: 74 65 70 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78  tep */.   || ((x
e900: 56 61 6c 75 65 3d 3d 30 29 21 3d 28 78 49 6e 76  Value==0)!=(xInv
e910: 65 72 73 65 3d 3d 30 29 29 20 20 20 20 2f 2a 20  erse==0))    /* 
e920: 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20  Both or neither 
e930: 6f 66 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65  of xValue, xInve
e940: 72 73 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41  rse */.   || (nA
e950: 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51  rg<-1 || nArg>SQ
e960: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
e970: 4e 5f 41 52 47 29 0a 20 20 20 7c 7c 20 28 32 35  N_ARG).   || (25
e980: 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  5<(nName = sqlit
e990: 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e  e3Strlen30( zFun
e9a0: 63 74 69 6f 6e 4e 61 6d 65 29 29 29 0a 20 20 29  ctionName))).  )
e9b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e9c0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e9d0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
e9e0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
e9f0: 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54  TANT==SQLITE_DET
ea00: 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20  ERMINISTIC );.  
ea10: 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63  extraFlags = enc
ea20: 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52   &  SQLITE_DETER
ea30: 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20  MINISTIC;.  enc 
ea40: 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f  &= (SQLITE_FUNC_
ea50: 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41  ENCMASK|SQLITE_A
ea60: 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20  NY);.  .#ifndef 
ea70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
ea80: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
ea90: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
eaa0: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
eab0: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
eac0: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
ead0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
eae0: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
eaf0: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
eb00: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
eb10: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
eb20: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
eb30: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
eb40: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
eb50: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
eb60: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
eb70: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
eb80: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
eb90: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
eba0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
ebb0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
ebc0: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
ebd0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
ebe0: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
ebf0: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
ec00: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
ec10: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ec20: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ec30: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
ec40: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
ec50: 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20  |extraFlags,.   
ec60: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
ec70: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20   xSFunc, xStep, 
ec80: 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20  xFinal, xValue, 
ec90: 78 49 6e 76 65 72 73 65 2c 20 70 44 65 73 74 72  xInverse, pDestr
eca0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
ecb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ecc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ecd0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
ece0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
ecf0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
ed00: 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73  F16LE|extraFlags
ed10: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
ed20: 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78  rData, xSFunc, x
ed30: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56  Step, xFinal, xV
ed40: 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20  alue, xInverse, 
ed50: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
ed60: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
ed70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ed80: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ed90: 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51    }.    enc = SQ
eda0: 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20  LITE_UTF16BE;.  
edb0: 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20  }.#else.  enc = 
edc0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e  SQLITE_UTF8;.#en
edd0: 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63  dif.  .  /* Chec
ede0: 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  k if an existing
edf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
ee00: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72  ng overridden or
ee10: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c   deleted. If so,
ee20: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20  .  ** and there 
ee30: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
ee40: 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  then return SQLI
ee50: 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75  TE_BUSY. If a fu
ee60: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62  nction.  ** is b
ee70: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f  eing overridden/
ee80: 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72  deleted but ther
ee90: 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
eea0: 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20  VMs, allow the. 
eeb0: 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f   ** operation to
eec0: 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e   continue but in
eed0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
eee0: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
eef0: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  nts..  */.  p = 
ef00: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
ef10: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
ef20: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
ef30: 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  )enc, 0);.  if( 
ef40: 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61  p && (p->funcFla
ef50: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
ef60: 5f 45 4e 43 4d 41 53 4b 29 3d 3d 28 75 33 32 29  _ENCMASK)==(u32)
ef70: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
ef80: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
ef90: 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
efa0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
efb0: 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
efc0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
efd0: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
efe0: 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
eff0: 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75  user-function du
f000: 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
f010: 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
f020: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
f030: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
f040: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f050: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
f060: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f070: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
f080: 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a  tements(db, 0);.
f090: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d      }.  }..  p =
f0a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
f0b0: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
f0c0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75  onName, nArg, (u
f0d0: 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73  8)enc, 1);.  ass
f0e0: 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ert(p || db->mal
f0f0: 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66  locFailed);.  if
f100: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
f110: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
f120: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
f130: 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73  If an older vers
f140: 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ion of the funct
f150: 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69  ion with a confi
f160: 67 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72  gured destructor
f170: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72   is.  ** being r
f180: 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74  eplaced invoke t
f190: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
f1a0: 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a  nction here. */.
f1b0: 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f    functionDestro
f1c0: 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28  y(db, p);..  if(
f1d0: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
f1e0: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
f1f0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
f200: 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20  ->u.pDestructor 
f210: 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20  = pDestructor;. 
f220: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20   p->funcFlags = 
f230: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
f240: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
f250: 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67  ASK) | extraFlag
f260: 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  s;.  testcase( p
f270: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
f280: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
f290: 49 43 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e  IC );.  p->xSFun
f2a0: 63 20 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46  c = xSFunc ? xSF
f2b0: 75 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70  unc : xStep;.  p
f2c0: 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46  ->xFinalize = xF
f2d0: 69 6e 61 6c 3b 0a 20 20 70 2d 3e 78 56 61 6c 75  inal;.  p->xValu
f2e0: 65 20 3d 20 78 56 61 6c 75 65 3b 0a 20 20 70 2d  e = xValue;.  p-
f2f0: 3e 78 49 6e 76 65 72 73 65 20 3d 20 78 49 6e 76  >xInverse = xInv
f300: 65 72 73 65 3b 0a 20 20 70 2d 3e 70 55 73 65 72  erse;.  p->pUser
f310: 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61  Data = pUserData
f320: 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75  ;.  p->nArg = (u
f330: 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72  16)nArg;.  retur
f340: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f350: 2f 2a 0a 2a 2a 20 57 6f 72 6b 65 72 20 66 75 6e  /*.** Worker fun
f360: 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20 75 74  ction used by ut
f370: 66 2d 38 20 41 50 49 73 20 74 68 61 74 20 63 72  f-8 APIs that cr
f380: 65 61 74 65 20 6e 65 77 20 66 75 6e 63 74 69 6f  eate new functio
f390: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  ns:.**.**    sql
f3a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
f3b0: 74 69 6f 6e 28 29 0a 2a 2a 20 20 20 20 73 71 6c  tion().**    sql
f3c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
f3d0: 74 69 6f 6e 5f 76 32 28 29 0a 2a 2a 20 20 20 20  tion_v2().**    
f3e0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 77  sqlite3_create_w
f3f0: 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 29  indow_function()
f400: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
f410: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69  reateFunctionApi
f420: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
f430: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f440: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
f450: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
f460: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
f470: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
f480: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
f490: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
f4a0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
f4b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f4c0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
f4d0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
f4e0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
f4f0: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
f500: 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69  d (*xValue)(sqli
f510: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
f520: 20 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65   void (*xInverse
f530: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
f540: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
f550: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 28  alue**),.  void(
f560: 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a  *xDestroy)(void*
f570: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
f580: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
f590: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
f5a0: 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65  pArg = 0;..#ifde
f5b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f5c0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f5d0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f5e0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f5f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
f600: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
f610: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f620: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f630: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78  >mutex);.  if( x
f640: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70  Destroy ){.    p
f650: 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72  Arg = (FuncDestr
f660: 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 4d  uctor *)sqlite3M
f670: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 75 6e  alloc(sizeof(Fun
f680: 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20  cDestructor));. 
f690: 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a     if( !pArg ){.
f6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
f6b0: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
f6c0: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
f6d0: 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20      goto out;.  
f6e0: 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 6e 52    }.    pArg->nR
f6f0: 65 66 20 3d 20 30 3b 0a 20 20 20 20 70 41 72 67  ef = 0;.    pArg
f700: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
f710: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
f720: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
f730: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
f740: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
f750: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
f760: 63 2c 20 70 2c 20 0a 20 20 20 20 20 20 78 53 46  c, p, .      xSF
f770: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
f780: 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76  al, xValue, xInv
f790: 65 72 73 65 2c 20 70 41 72 67 0a 20 20 29 3b 0a  erse, pArg.  );.
f7a0: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
f7b0: 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  rg->nRef==0 ){. 
f7c0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
f7d0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
f7e0: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
f7f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41   sqlite3_free(pA
f800: 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a  rg);.  }.. out:.
f810: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
f820: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
f830: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f840: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
f850: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f860: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65  ./*.** Create ne
f870: 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73  w user functions
f880: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f890: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
f8a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
f8b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f8c0: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
f8d0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
f8e0: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
f8f0: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
f900: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
f910: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
f920: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
f930: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f940: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
f950: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
f960: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
f970: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
f980: 20 72 65 74 75 72 6e 20 63 72 65 61 74 65 46 75   return createFu
f990: 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46  nctionApi(db, zF
f9a0: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
f9b0: 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  p, xSFunc, xStep
f9c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c        xFinal, 0,
f9f0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
fa00: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
fa10: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ction_v2(.  sqli
fa20: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
fa30: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
fa40: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
fa50: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
fa60: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
fa70: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
fa80: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
fa90: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
faa0: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
fab0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
fac0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
fad0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
fae0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
faf0: 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44  t*),.  void (*xD
fb00: 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a  estroy)(void *).
fb10: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61  ){.  return crea
fb20: 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62  teFunctionApi(db
fb30: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
fb40: 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78  nc, p, xSFunc, x
fb50: 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Step,.          
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c            xFinal
fb80: 2c 20 30 2c 20 30 2c 20 78 44 65 73 74 72 6f 79  , 0, 0, xDestroy
fb90: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
fba0: 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66  _create_window_f
fbb0: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
fbc0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
fbd0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69  char *zFunc,.  i
fbe0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
fbf0: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  nc,.  void *p,. 
fc00: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
fc10: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
fc20: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
fc30: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
fc40: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
fc50: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
fc60: 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69  d (*xValue)(sqli
fc70: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
fc80: 20 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65   void (*xInverse
fc90: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
fca0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
fcb0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
fcc0: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
fcd0: 64 20 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  d *).){.  return
fce0: 20 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41   createFunctionA
fcf0: 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  pi(db, zFunc, nA
fd00: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 30 2c 20 78  rg, enc, p, 0, x
fd10: 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Step,.          
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd30: 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c            xFinal
fd40: 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72  , xValue, xInver
fd50: 73 65 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d  se, xDestroy);.}
fd60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fd70: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
fd80: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
fd90: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
fda0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
fdb0: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
fdc0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
fdd0: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
fde0: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
fdf0: 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73  void (*xSFunc)(s
fe00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
fe10: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
fe20: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
fe30: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
fe40: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
fe50: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
fe60: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
fe70: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
fe80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
fe90: 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69  har *zFunc8;..#i
fea0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
feb0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
fec0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
fed0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
fee0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
fef0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ff00: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
ff10: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
ff20: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ff30: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
ff40: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
ff50: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
ff60: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
ff70: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
ff80: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
ff90: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72  TF16NATIVE);.  r
ffa0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
ffb0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
ffc0: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
ffd0: 2c 20 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65  , p, xSFunc,xSte
ffe0: 70 2c 78 46 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b  p,xFinal,0,0,0);
fff0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
10000 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20  (db, zFunc8);.  
10010 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
10020 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
10030 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10040 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
10060 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ndif.../*.** The
10070 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68   following is th
10080 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
10090 20 6f 66 20 61 6e 20 53 51 4c 20 66 75 6e 63 74   of an SQL funct
100a0 69 6f 6e 20 74 68 61 74 20 61 6c 77 61 79 73 0a  ion that always.
100b0 2a 2a 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e  ** fails with an
100c0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
100d0 74 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  tating that the 
100e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
100f0 20 69 6e 20 74 68 65 0a 2a 2a 20 77 72 6f 6e 67   in the.** wrong
10100 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 73   context.  The s
10110 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
10120 66 75 6e 63 74 69 6f 6e 28 29 20 41 50 49 20 6d  function() API m
10130 69 67 68 74 20 63 6f 6e 73 74 72 75 63 74 0a 2a  ight construct.*
10140 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  * SQL function t
10150 68 61 74 20 75 73 65 20 74 68 69 73 20 72 6f 75  hat use this rou
10160 74 69 6e 65 20 73 6f 20 74 68 61 74 20 74 68 65  tine so that the
10170 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20   functions will 
10180 65 78 69 73 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d  exist.** for nam
10190 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 62 75 74  e resolution but
101a0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 6f 76   are actually ov
101b0 65 72 6c 6f 61 64 65 64 20 62 79 20 74 68 65 20  erloaded by the 
101c0 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a  xFindFunction.**
101d0 20 6d 65 74 68 6f 64 20 6f 66 20 76 69 72 74 75   method of virtu
101e0 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  al tables..*/.st
101f0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
10200 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e  3InvalidFunction
10210 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
10220 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 20 2f  ext *context,  /
10230 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  * The function c
10240 61 6c 6c 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  alling context *
10250 2f 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  /.  int NotUsed,
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10270 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
10280 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
10290 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
102a0 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
102b0 65 64 32 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f  ed2   /* Value o
102c0 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
102d0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
102e0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
102f0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
10300 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
10310 78 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  xt);.  char *zEr
10320 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
10330 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
10340 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 7a 45 72  NotUsed2);.  zEr
10350 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
10360 6e 74 66 28 0a 20 20 20 20 20 20 22 75 6e 61 62  ntf(.      "unab
10370 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  le to use functi
10380 6f 6e 20 25 73 20 69 6e 20 74 68 65 20 72 65 71  on %s in the req
10390 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74 22 2c  uested context",
103a0 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
103b0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
103c0 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d  context, zErr, -
103d0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
103e0 65 65 28 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a  ee(zErr);.}../*.
103f0 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
10400 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
10410 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
10420 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
10430 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10440 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
10450 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
10460 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
10470 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
10480 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10490 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
104a0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
104b0 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
104c0 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
104d0 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
104e0 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
104f0 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
10500 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
10510 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
10520 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
10530 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
10540 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
10550 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
10560 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
10570 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
10580 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
10590 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
105a0 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
105b0 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
105c0 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
105d0 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
105e0 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
105f0 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
10600 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
10610 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
10620 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
10630 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43  t rc;.  char *zC
10640 6f 70 79 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  opy;..#ifdef SQL
10650 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10660 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
10670 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
10680 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30  (db) || zName==0
10690 20 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20   || nArg<-2 ){. 
106a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
106b0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
106c0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
106d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
106e0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20  b->mutex);.  rc 
106f0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
10700 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ction(db, zName,
10710 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
10720 46 38 2c 20 30 29 21 3d 30 3b 0a 20 20 73 71 6c  F8, 0)!=0;.  sql
10730 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10740 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
10750 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 53  f( rc ) return S
10760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70  QLITE_OK;.  zCop
10770 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
10780 6e 74 66 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ntf(zName);.  if
10790 28 20 7a 43 6f 70 79 3d 3d 30 20 29 20 72 65 74  ( zCopy==0 ) ret
107a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
107b0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
107c0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
107d0 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c  on_v2(db, zName,
107e0 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
107f0 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  F8,.            
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
10810 43 6f 70 79 2c 20 73 71 6c 69 74 65 33 49 6e 76  Copy, sqlite3Inv
10820 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  alidFunction, 0,
10830 20 30 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65   0, sqlite3_free
10840 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
10850 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
10860 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
10870 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e   trace function.
10880 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
10890 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
108a0 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a  egistered trace.
108b0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
108c0 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74   .**.** A NULL t
108d0 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  race function me
108e0 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63  ans that no trac
108f0 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
10900 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
10910 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74  trace is a point
10920 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
10930 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
10940 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
10950 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61   each.** SQL sta
10960 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64  tement..*/.#ifnd
10970 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
10980 45 50 52 45 43 41 54 45 44 0a 76 6f 69 64 20 2a  EPRECATED.void *
10990 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
109a0 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 28  lite3 *db, void(
109b0 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
109c0 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
109d0 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
109e0 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
109f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
10a00 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
10a10 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10a20 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
10a30 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
10a40 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
10a50 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
10a60 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
10a70 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
10a80 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
10a90 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
10aa0 2d 3e 6d 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->mTrace = xTrac
10ab0 65 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 43 45  e ? SQLITE_TRACE
10ac0 5f 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20 20 64  _LEGACY : 0;.  d
10ad0 62 2d 3e 78 54 72 61 63 65 20 3d 20 28 69 6e 74  b->xTrace = (int
10ae0 28 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f  (*)(u32,void*,vo
10af0 69 64 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61 63  id*,void*))xTrac
10b00 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
10b10 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
10b20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10b30 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10b40 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65  eturn pOld;.}.#e
10b50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10b60 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a  MIT_DEPRECATED *
10b70 2f 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61  /../* Register a
10b80 20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20   trace callback 
10b90 75 73 69 6e 67 20 74 68 65 20 76 65 72 73 69 6f  using the versio
10ba0 6e 2d 32 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  n-2 interface..*
10bb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 72  /.int sqlite3_tr
10bc0 61 63 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ace_v2(.  sqlite
10bd0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bf0 20 20 20 20 20 2f 2a 20 54 72 61 63 65 20 74 68       /* Trace th
10c00 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  is connection */
10c10 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 72 61  .  unsigned mTra
10c20 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c40 20 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74 73 20   Mask of events 
10c50 74 6f 20 62 65 20 74 72 61 63 65 64 20 2a 2f 0a  to be traced */.
10c60 20 20 69 6e 74 28 2a 78 54 72 61 63 65 29 28 75    int(*xTrace)(u
10c70 6e 73 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f  nsigned,void*,vo
10c80 69 64 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20  id*,void*),  /* 
10c90 43 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f  Callback to invo
10ca0 6b 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  ke */.  void *pA
10cb0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f     /* Context */
10ce0 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
10cf0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10d00 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10d10 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10d20 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
10d30 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
10d40 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
10d50 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10d60 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10d70 3b 0a 20 20 69 66 28 20 6d 54 72 61 63 65 3d 3d  ;.  if( mTrace==
10d80 30 20 29 20 78 54 72 61 63 65 20 3d 20 30 3b 0a  0 ) xTrace = 0;.
10d90 20 20 69 66 28 20 78 54 72 61 63 65 3d 3d 30 20    if( xTrace==0 
10da0 29 20 6d 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  ) mTrace = 0;.  
10db0 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72  db->mTrace = mTr
10dc0 61 63 65 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  ace;.  db->xTrac
10dd0 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62  e = xTrace;.  db
10de0 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
10df0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
10e00 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10e10 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
10e20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
10e30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10e40 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
10e50 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f  * Register a pro
10e60 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  file function.  
10e70 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
10e80 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
10e90 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66  istered .** prof
10ea0 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ile function is 
10eb0 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
10ec0 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65  * A NULL profile
10ed0 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
10ee0 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e  that no profilin
10ef0 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
10f00 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72  A non-NULL.** pr
10f10 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74  ofile is a point
10f20 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
10f30 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
10f40 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
10f50 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51  on of.** each SQ
10f60 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
10f70 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64   is run..*/.void
10f80 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c   *sqlite3_profil
10f90 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
10fa0 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66  ,.  void (*xProf
10fb0 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ile)(void*,const
10fc0 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69   char*,sqlite_ui
10fd0 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
10fe0 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Arg.){.  void *p
10ff0 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
11000 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
11010 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
11020 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
11030 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
11040 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
11050 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
11060 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
11070 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11080 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11090 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50  .  pOld = db->pP
110a0 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d  rofileArg;.  db-
110b0 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f  >xProfile = xPro
110c0 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f  file;.  db->pPro
110d0 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  fileArg = pArg;.
110e0 20 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 3d 20    db->mTrace &= 
110f0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4e 4f 4e  SQLITE_TRACE_NON
11100 4c 45 47 41 43 59 5f 4d 41 53 4b 3b 0a 20 20 69  LEGACY_MASK;.  i
11110 66 28 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20  f( db->xProfile 
11120 29 20 64 62 2d 3e 6d 54 72 61 63 65 20 7c 3d 20  ) db->mTrace |= 
11130 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 58 50 52  SQLITE_TRACE_XPR
11140 4f 46 49 4c 45 3b 0a 20 20 73 71 6c 69 74 65 33  OFILE;.  sqlite3
11150 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11160 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11170 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
11180 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11190 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 23 65  DEPRECATED */.#e
111a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
111b0 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  MIT_TRACE */../*
111c0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66  .** Register a f
111d0 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
111e0 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61  voked when a tra
111f0 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
11200 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f  ..** If the invo
11210 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ked function ret
11220 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
11230 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62  hen the commit b
11240 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c  ecomes a.** roll
11250 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  back..*/.void *s
11260 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
11270 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
11280 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
11290 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
112a0 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
112b0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ase */.  int (*x
112c0 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
112d0 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ,  /* Function t
112e0 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68  o invoke on each
112f0 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69   commit */.  voi
11300 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
11310 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
11320 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
11330 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
11340 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
11350 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
11360 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
11370 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
11380 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
11390 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
113a0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
113b0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
113c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
113d0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
113e0 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
113f0 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62  pCommitArg;.  db
11400 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
11410 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
11420 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20   db->pCommitArg 
11430 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
11440 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11450 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
11460 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pOld;.}../*.*
11470 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
11480 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
11490 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
114a0 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
114b0 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
114c0 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
114d0 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
114e0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
114f0 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68  sqlite3_update_h
11500 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
11510 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
11520 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
11530 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
11540 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
11550 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
11560 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
11570 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c   *,char const *,
11580 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20  sqlite_int64),. 
11590 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
115a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
115b0 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
115c0 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
115d0 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64  oid *pRet;..#ifd
115e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
115f0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
11600 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
11610 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
11620 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
11630 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
11640 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
11650 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
11660 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
11670 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
11680 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
11690 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
116a0 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
116b0 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
116c0 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
116d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
116e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
116f0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
11700 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
11710 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
11720 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
11730 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
11740 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
11750 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
11760 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
11770 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
11780 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
11790 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
117a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
117b0 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
117c0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
117d0 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
117e0 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
117f0 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
11800 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
11810 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
11820 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
11830 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
11840 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
11850 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
11860 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
11870 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
11880 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
11890 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
118a0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
118b0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
118c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
118d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
118e0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
118f0 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c  pRet = db->pRoll
11900 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78  backArg;.  db->x
11910 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
11920 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
11930 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
11940 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
11950 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
11960 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11970 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
11980 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11990 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
119a0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
119b0 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
119c0 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
119d0 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61  me a row is upda
119e0 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ted,.** inserted
119f0 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e   or deleted usin
11a00 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
11a10 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
11a20 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 65  oid *sqlite3_pre
11a30 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73  update_hook(.  s
11a40 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
11a50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
11a60 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
11a70 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
11a80 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63    void(*xCallbac
11a90 6b 29 28 20 20 20 20 20 20 20 20 20 2f 2a 20 43  k)(         /* C
11aa0 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
11ab0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71   */.    void*,sq
11ac0 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20  lite3*,int,char 
11ad0 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73  const*,char cons
11ae0 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  t*,sqlite3_int64
11af0 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c  ,sqlite3_int64),
11b00 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b20 46 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 61  First callback a
11b30 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
11b40 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
11b50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
11b60 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
11b70 70 52 65 74 20 3d 20 64 62 2d 3e 70 50 72 65 55  pRet = db->pPreU
11b80 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e  pdateArg;.  db->
11b90 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
11ba0 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
11bb0 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
11bc0 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
11bd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11be0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
11bf0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
11c00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11c10 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
11c20 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  _HOOK */..#ifnde
11c30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
11c40 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  L./*.** The sqli
11c50 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
11c60 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
11c70 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61  ed by sqlite3_wa
11c80 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
11c90 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71  ()..** Invoke sq
11ca0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
11cb0 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62  oint if the numb
11cc0 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20  er of frames in 
11cd0 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20  the log file.** 
11ce0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
11cf0 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20  sqlite3.pWalArg 
11d00 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
11d10 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f  er (the value co
11d20 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77  nfigured by.** w
11d30 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
11d40 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  t())..*/ .int sq
11d50 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
11d60 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  ook(.  void *pCl
11d70 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a  ientData,     /*
11d80 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73   Argument */.  s
11d90 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
11da0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
11db0 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
11dc0 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
11dd0 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  /* Database */. 
11de0 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20   int nFrame     
11df0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
11e00 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69  of WAL */.){.  i
11e10 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54  f( nFrame>=SQLIT
11e20 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c  E_PTR_TO_INT(pCl
11e30 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20  ientData) ){.   
11e40 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
11e50 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
11e60 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
11e70 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29  ckpoint(db, zDb)
11e80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
11e90 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11ea0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11eb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11ec0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11ed0 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  WAL */../*.** Co
11ee0 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74  nfigure an sqlit
11ef0 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
11f00 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61  llback to automa
11f10 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
11f20 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  nt.** a database
11f30 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e   after committin
11f40 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
11f50 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72  if there are nFr
11f60 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66  ame or.** more f
11f70 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
11f80 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a   file. Passing z
11f90 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76  ero or a negativ
11fa0 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a  e value as the.*
11fb0 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74  * nFrame paramet
11fc0 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f  er disables auto
11fd0 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
11fe0 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a  s entirely..**.*
11ff0 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  * The callback r
12000 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69  egistered by thi
12010 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61  s function repla
12020 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ces any existing
12030 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67   callback.** reg
12040 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71  istered using sq
12050 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
12060 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69  . Likewise, regi
12070 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61  stering a callba
12080 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  ck.** using sqli
12090 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64  te3_wal_hook() d
120a0 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f  isables the auto
120b0 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
120c0 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f   mechanism.** co
120d0 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73  nfigured by this
120e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
120f0 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  t sqlite3_wal_au
12100 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  tocheckpoint(sql
12110 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46  ite3 *db, int nF
12120 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51  rame){.#ifdef SQ
12130 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
12140 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12150 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (db);.  UNUSED_P
12160 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29  ARAMETER(nFrame)
12170 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53  ;.#else.#ifdef S
12180 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
12190 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
121a0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
121b0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
121c0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
121d0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
121e0 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20   nFrame>0 ){.   
121f0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
12200 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c  k(db, sqlite3Wal
12210 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c  DefaultHook, SQL
12220 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
12230 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  Frame));.  }else
12240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
12250 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29  l_hook(db, 0, 0)
12260 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
12270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
12290 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
122a0 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
122b0 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
122c0 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ion is written.*
122d0 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65  * into the write
122e0 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68  -ahead-log by th
122f0 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
12300 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
12310 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f  *sqlite3_wal_hoo
12320 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
12330 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12340 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
12350 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
12360 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
12370 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  nt(*xCallback)(v
12380 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  oid *, sqlite3*,
12390 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
123a0 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
123d0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
123e0 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
123f0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
12400 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f  TE_OMIT_WAL.  vo
12410 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66  id *pRet;.#ifdef
12420 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
12430 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
12440 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12450 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
12460 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
12470 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
12480 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
12490 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
124a0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
124b0 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
124c0 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d  ->pWalArg;.  db-
124d0 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20  >xWalCallback = 
124e0 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
124f0 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b  >pWalArg = pArg;
12500 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12510 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
12520 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
12530 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
12540 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
12550 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
12560 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a  atabase zDb..*/.
12570 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
12580 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20  checkpoint_v2(. 
12590 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
125c0 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
125d0 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
125e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
125f0 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
12600 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20  abase (or NULL) 
12610 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20  */.  int eMode, 
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43       /* SQLITE_C
12640 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75  HECKPOINT_* valu
12650 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f  e */.  int *pnLo
12660 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
12670 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
12680 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69  ize of WAL log i
12690 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  n frames */.  in
126a0 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20  t *pnCkpt       
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
126c0 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62   OUT: Total numb
126d0 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65  er of frames che
126e0 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a  ckpointed */.){.
126f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12700 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20  IT_WAL.  return 
12710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
12720 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
12750 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  e */.  int iDb =
12760 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
12770 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65  CHED;  /* sqlite
12780 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66  3.aDb[] index of
12790 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e   db to checkpoin
127a0 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  t */..#ifdef SQL
127b0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
127c0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
127d0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
127e0 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
127f0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12800 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
12810 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75  nitialize the ou
12820 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74  tput variables t
12830 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20  o -1 in case an 
12840 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
12850 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a  .  if( pnLog ) *
12860 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66  pnLog = -1;.  if
12870 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b  ( pnCkpt ) *pnCk
12880 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65  pt = -1;..  asse
12890 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
128a0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30  POINT_PASSIVE==0
128b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
128c0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
128d0 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73  FULL==1 );.  ass
128e0 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
128f0 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d  KPOINT_RESTART==
12900 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
12910 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
12920 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a  _TRUNCATE==3 );.
12930 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49    if( eMode<SQLI
12940 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
12950 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53  SSIVE || eMode>S
12960 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
12970 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
12980 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
12990 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54   R-03996-12088 T
129a0 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d  he M parameter m
129b0 75 73 74 20 62 65 20 61 20 76 61 6c 69 64 20 63  ust be a valid c
129c0 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a  heckpoint.    **
129d0 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65   mode: */.    re
129e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
129f0 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
12a00 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
12a10 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
12a20 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
12a30 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
12a40 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
12a50 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
12a60 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
12a70 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
12a80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
12a90 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
12aa0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
12ab0 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
12ac0 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
12ad0 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48  e{.    db->busyH
12ae0 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
12af0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12b00 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
12b10 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c   iDb, eMode, pnL
12b20 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
12b30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
12b40 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20  , rc);.  }.  rc 
12b50 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
12b60 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20  (db, rc);..  /* 
12b70 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
12b80 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
12b90 73 2c 20 63 6c 65 61 72 20 74 68 65 20 69 6e 74  s, clear the int
12ba0 65 72 72 75 70 74 20 66 6c 61 67 20 61 74 20 74  errupt flag at t
12bb0 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  his.  ** point. 
12bc0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56   */.  if( db->nV
12bd0 64 62 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a  dbeActive==0 ){.
12be0 20 20 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74      db->u1.isInt
12bf0 65 72 72 75 70 74 65 64 20 3d 20 30 3b 0a 20 20  errupted = 0;.  
12c00 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
12c10 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
12c20 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
12c30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
12c40 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
12c50 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a  tabase zDb. If z
12c60 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69  Db is NULL, or i
12c70 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 44 62  f the buffer zDb
12c80 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f   points.** to co
12c90 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65  ntains a zero-le
12ca0 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c  ngth string, all
12cb0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
12cc0 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63  ses are .** chec
12cd0 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74  kpointed..*/.int
12ce0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
12cf0 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
12d00 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
12d10 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44  *zDb){.  /* EVID
12d20 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33  ENCE-OF: R-41613
12d30 2d 32 30 35 35 33 20 54 68 65 20 73 71 6c 69 74  -20553 The sqlit
12d40 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
12d50 74 28 44 2c 58 29 20 69 73 20 65 71 75 69 76 61  t(D,X) is equiva
12d60 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c  lent to.  ** sql
12d70 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
12d80 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54  int_v2(D,X,SQLIT
12d90 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
12da0 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20  SIVE,0,0). */.  
12db0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77  return sqlite3_w
12dc0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
12dd0 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43  (db,zDb,SQLITE_C
12de0 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
12df0 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64  E,0,0);.}..#ifnd
12e00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
12e10 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63  AL./*.** Run a c
12e20 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74  heckpoint on dat
12e30 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20  abase iDb. This 
12e40 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61  is a no-op if da
12e50 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a  tabase iDb is.**
12e60 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f   not currently o
12e70 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  pen in WAL mode.
12e80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
12e90 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
12ea0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
12eb0 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
12ec0 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ed, this .** fun
12ed0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
12ee0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  LITE_LOCKED and 
12ef0 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  a checkpoint is 
12f00 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49  not attempted. I
12f10 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  f .** an error o
12f20 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e  ccurs while runn
12f30 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ing the checkpoi
12f40 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  nt, an SQLite er
12f50 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
12f60 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53  returned (i.e. S
12f70 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74  QLITE_IOERR). Ot
12f80 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
12f90 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  OK..**.** The mu
12fa0 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
12fb0 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64  handle db should
12fc0 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20   be held by the 
12fd0 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65  caller. The mute
12fe0 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  x.** associated 
12ff0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
13000 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63  c b-tree being c
13010 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74  heckpointed is t
13020 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20  aken by.** this 
13030 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74  function while t
13040 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73  he checkpoint is
13050 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   running..**.** 
13060 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64  If iDb is passed
13070 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
13080 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61  CHED, then all a
13090 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
130a0 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f  s are.** checkpo
130b0 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72  inted. If an err
130c0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
130d0 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  d it is returned
130e0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a   immediately -.*
130f0 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20  * no attempt is 
13100 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69  made to checkpoi
13110 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67  nt any remaining
13120 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
13130 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  * Parameter eMod
13140 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49  e is one of SQLI
13150 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
13160 53 53 49 56 45 2c 20 46 55 4c 4c 2c 20 52 45 53  SSIVE, FULL, RES
13170 54 41 52 54 0a 2a 2a 20 6f 72 20 54 52 55 4e 43  TART.** or TRUNC
13180 41 54 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ATE..*/.int sqli
13190 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71  te3Checkpoint(sq
131a0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
131b0 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69  Db, int eMode, i
131c0 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a  nt *pnLog, int *
131d0 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72  pnCkpt){.  int r
131e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
131f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13200 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
13210 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13230 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
13240 65 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68  e through attach
13250 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20  ed dbs */.  int 
13260 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20  bBusy = 0;      
13270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13280 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55  rue if SQLITE_BU
13290 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f  SY has been enco
132a0 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73  untered */..  as
132b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
132c0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
132d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
132e0 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f   !pnLog || *pnLo
132f0 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72  g==-1 );.  asser
13300 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70  t( !pnCkpt || *p
13310 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20  nCkpt==-1 );..  
13320 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
13330 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  Db && rc==SQLITE
13340 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  _OK; i++){.    i
13350 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62  f( i==iDb || iDb
13360 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
13370 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72  ACHED ){.      r
13380 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13390 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61  Checkpoint(db->a
133a0 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65  Db[i].pBt, eMode
133b0 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
133c0 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20  ;.      pnLog = 
133d0 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20  0;.      pnCkpt 
133e0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
133f0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
13400 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20  {.        bBusy 
13410 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
13420 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13430 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
13440 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
13450 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79  LITE_OK && bBusy
13460 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ) ? SQLITE_BUSY 
13470 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  : rc;.}.#endif /
13480 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
13490 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  L */../*.** This
134a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
134b0 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d  s true if main-m
134c0 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  emory should be 
134d0 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  used instead of.
134e0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
134f0 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e  ile for transien
13500 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e  t pager files an
13510 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  d statement jour
13520 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  nals..** The val
13530 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65  ue returned depe
13540 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
13550 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f   of db->temp_sto
13560 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70  re (runtime.** p
13570 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68  arameter) and th
13580 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76  e compile time v
13590 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54  alue of SQLITE_T
135a0 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a  EMP_STORE. The.*
135b0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  * following tabl
135c0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
135d0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74  relationship bet
135e0 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76  ween these two v
135f0 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69  alues.** and thi
13600 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  s functions retu
13610 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  rn value..**.** 
13620 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54    SQLITE_TEMP_ST
13630 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70  ORE     db->temp
13640 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74  _store     Locat
13650 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  ion of temporary
13660 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d   database.**   -
13670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13680 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
13690 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
136a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136b0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
136e0 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
136f0 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
13720 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
13730 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
13740 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
13750 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
13760 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
13770 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
13780 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
13790 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
137b0 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
137c0 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
13800 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
13830 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
13840 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20  eturn 1).**   2 
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13870 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
13880 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
13890 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
138a0 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20         any      
138b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
138c0 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
138d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d  /.int sqlite3Tem
138e0 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20  pInMemory(const 
138f0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
13900 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
13910 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20  ORE==1.  return 
13920 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
13930 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==2 );.#endif.#i
13940 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
13950 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20  ORE==2.  return 
13960 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
13970 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  !=1 );.#endif.#i
13980 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
13990 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f  ORE==3.  UNUSED_
139a0 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
139b0 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
139c0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
139d0 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c  P_STORE<1 || SQL
139e0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33  ITE_TEMP_STORE>3
139f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
13a00 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72  TER(db);.  retur
13a10 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
13a20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
13a30 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  8 encoded Englis
13a40 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
13a50 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
13a60 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
13a70 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  or..*/.const cha
13a80 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  r *sqlite3_errms
13a90 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  g(sqlite3 *db){.
13aa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
13ab0 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
13ac0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
13ad0 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
13ae0 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  MEM_BKPT);.  }. 
13af0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
13b00 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
13b10 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
13b20 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
13b30 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  (SQLITE_MISUSE_B
13b40 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  KPT);.  }.  sqli
13b50 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
13b60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
13b70 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
13b80 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71  ed ){.    z = sq
13b90 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
13ba0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
13bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73    }else{.    tes
13bc0 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d  tcase( db->pErr=
13bd0 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 64 62  =0 );.    z = db
13be0 2d 3e 65 72 72 43 6f 64 65 20 3f 20 28 63 68 61  ->errCode ? (cha
13bf0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
13c00 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 20  _text(db->pErr) 
13c10 3a 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  : 0;.    assert(
13c20 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
13c30 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  ed );.    if( z=
13c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
13c50 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
13c60 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20  ->errCode);.    
13c70 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
13c80 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
13c90 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
13ca0 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
13cb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
13cc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
13cd0 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67  F-16 encoded Eng
13ce0 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
13cf0 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
13d00 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
13d10 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
13d20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72  void *sqlite3_er
13d30 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a  rmsg16(sqlite3 *
13d40 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
13d50 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d  nst u16 outOfMem
13d60 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20  [] = {.    'o', 
13d70 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27  'u', 't', ' ', '
13d80 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d  o', 'f', ' ', 'm
13d90 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27  ', 'e', 'm', 'o'
13da0 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20  , 'r', 'y', 0.  
13db0 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
13dc0 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d  t u16 misuse[] =
13dd0 20 7b 0a 20 20 20 20 27 62 27 2c 20 27 61 27 2c   {.    'b', 'a',
13de0 20 27 64 27 2c 20 27 20 27 2c 20 27 70 27 2c 20   'd', ' ', 'p', 
13df0 27 61 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27  'a', 'r', 'a', '
13e00 6d 27 2c 20 27 65 27 2c 20 27 74 27 2c 20 27 65  m', 'e', 't', 'e
13e10 27 2c 20 27 72 27 2c 20 27 20 27 2c 0a 20 20 20  ', 'r', ' ',.   
13e20 20 27 6f 27 2c 20 27 72 27 2c 20 27 20 27 2c 20   'o', 'r', ' ', 
13e30 27 6f 27 2c 20 27 74 27 2c 20 27 68 27 2c 20 27  'o', 't', 'h', '
13e40 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 41  e', 'r', ' ', 'A
13e50 27 2c 20 27 50 27 2c 20 27 49 27 2c 20 27 20 27  ', 'P', 'I', ' '
13e60 2c 0a 20 20 20 20 27 6d 27 2c 20 27 69 27 2c 20  ,.    'm', 'i', 
13e70 27 73 27 2c 20 27 75 27 2c 20 27 73 27 2c 20 27  's', 'u', 's', '
13e80 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f  e', 0.  };..  co
13e90 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69  nst void *z;.  i
13ea0 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
13eb0 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74  turn (void *)out
13ec0 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  OfMem;.  }.  if(
13ed0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
13ee0 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
13ef0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
13f00 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20  void *)misuse;. 
13f10 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
13f20 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
13f30 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
13f40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13f50 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f     z = (void *)o
13f60 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65  utOfMem;.  }else
13f70 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
13f80 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
13f90 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66  b->pErr);.    if
13fa0 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
13fb0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
13fc0 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43  Msg(db, db->errC
13fd0 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53  ode, sqlite3ErrS
13fe0 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29  tr(db->errCode))
13ff0 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
14000 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
14010 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
14020 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  }.    /* A mallo
14030 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69  c() may have fai
14040 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  led within the c
14050 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  all to sqlite3_v
14060 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20  alue_text16().  
14070 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
14080 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
14090 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
140a0 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
140b0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
140c0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
140d0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20  e returning. Do 
140e0 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69  this directly, i
140f0 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20  nstead of via.  
14100 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45    ** sqlite3ApiE
14110 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20  xit(), to avoid 
14120 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61  setting the data
14130 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f  base handle erro
14140 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a  r message..    *
14150 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  /.    sqlite3Oom
14160 43 6c 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20  Clear(db);.  }. 
14170 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14180 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
14190 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
141a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
141b0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
141c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
141d0 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
141e0 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  r code generated
141f0 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f   by an SQLite ro
14200 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69  utine. If NULL i
14210 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74  s.** passed to t
14220 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65  his function, we
14230 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63   assume a malloc
14240 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67  () failed during
14250 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
14260 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
14270 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
14280 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
14290 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
142a0 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
142b0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
142c0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
142d0 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
142e0 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
142f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
14300 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14310 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
14320 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20  urn db->errCode 
14330 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
14340 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
14350 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71  ended_errcode(sq
14360 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
14370 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33  ( db && !sqlite3
14380 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
14390 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
143a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
143b0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
143c0 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d  if( !db || db->m
143d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
143e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
143f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
14400 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
14410 72 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rCode;.}.int sql
14420 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e  ite3_system_errn
14430 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  o(sqlite3 *db){.
14440 20 20 72 65 74 75 72 6e 20 64 62 20 3f 20 64 62    return db ? db
14450 2d 3e 69 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b  ->iSysErrno : 0;
14460 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  .}  ../*.** Retu
14470 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
14480 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
14490 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
144a0 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
144b0 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20   argument.  For 
144c0 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79  now, this simply
144d0 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72   calls the inter
144e0 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74  nal sqlite3ErrSt
144f0 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  r().** function.
14500 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
14510 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69  sqlite3_errstr(i
14520 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e  nt rc){.  return
14530 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
14540 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  c);.}../*.** Cre
14550 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ate a new collat
14560 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
14570 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20   database "db". 
14580 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61   The name is zNa
14590 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e  me.** and the en
145a0 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a  coding is enc..*
145b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
145c0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  ateCollation(.  
145d0 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63  sqlite3* db,.  c
145e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
145f0 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76  , .  u8 enc,.  v
14600 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
14610 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
14620 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
14630 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
14640 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
14650 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
14660 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
14670 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61  int enc2;.  .  a
14680 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14690 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
146a0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
146b0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
146c0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
146d0 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
146e0 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
146f0 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
14700 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
14710 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
14720 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
14730 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
14740 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
14750 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
14760 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
14770 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b  */.  enc2 = enc;
14780 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
14790 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
147a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  );.  testcase( e
147b0 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
147c0 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69  6_ALIGNED );.  i
147d0 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  f( enc2==SQLITE_
147e0 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53  UTF16 || enc2==S
147f0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
14800 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20  NED ){.    enc2 
14810 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
14820 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TIVE;.  }.  if( 
14830 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38  enc2<SQLITE_UTF8
14840 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f   || enc2>SQLITE_
14850 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72  UTF16BE ){.    r
14860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
14870 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  USE_BKPT;.  }.. 
14880 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
14890 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69  s call is removi
148a0 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20  ng or replacing 
148b0 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c  an existing coll
148c0 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75  ation .  ** sequ
148d0 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64  ence. If so, and
148e0 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
148f0 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75  e VMs, return bu
14900 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a  sy. If there.  *
14910 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
14920 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  VMs, invalidate 
14930 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  any pre-compiled
14940 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
14950 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  /.  pColl = sqli
14960 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
14970 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
14980 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43  me, 0);.  if( pC
14990 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
149a0 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  mp ){.    if( db
149b0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
149c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
149d0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
149e0 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
149f0 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
14a00 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
14a10 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14a20 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
14a30 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
14a40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14a50 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
14a60 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
14a70 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
14a80 28 64 62 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  (db, 0);..    /*
14a90 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
14aa0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
14ab0 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
14ac0 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
14ad0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
14ae0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
14af0 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
14b00 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
14b10 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
14b20 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
14b30 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
14b40 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
14b50 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
14b60 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
14b70 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
14b80 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
14b90 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
14ba0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
14bb0 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
14bc0 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
14bd0 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
14be0 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
14bf0 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
14c00 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
14c10 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
14c20 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
14c30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
14c40 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
14c50 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
14c60 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
14c70 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
14c80 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
14c90 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
14ca0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
14cb0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
14cc0 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
14cd0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
14ce0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
14cf0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
14d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14d10 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
14d20 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
14d30 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
14d40 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
14d50 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
14d60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
14d70 4b 50 54 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  KPT;.  pColl->xC
14d80 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
14d90 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
14da0 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
14db0 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
14dc0 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
14dd0 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
14de0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
14df0 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
14e00 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
14e10 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OK);.  return SQ
14e20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
14e30 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65  ** This array de
14e40 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72  fines hard upper
14e50 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74   bounds on limit
14e60 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a   values.  The.**
14e70 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73   initializer mus
14e80 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e  t be kept in syn
14e90 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  c with the SQLIT
14ea0 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65  E_LIMIT_*.** #de
14eb0 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33  fines in sqlite3
14ec0 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  .h..*/.static co
14ed0 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d  nst int aHardLim
14ee0 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54  it[] = {.  SQLIT
14ef0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20  E_MAX_LENGTH,.  
14f00 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
14f10 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
14f20 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51  MAX_COLUMN,.  SQ
14f30 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
14f40 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
14f50 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
14f60 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  T,.  SQLITE_MAX_
14f70 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54  VDBE_OP,.  SQLIT
14f80 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
14f90 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  RG,.  SQLITE_MAX
14fa0 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c  _ATTACHED,.  SQL
14fb0 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
14fc0 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  TERN_LENGTH,.  S
14fd0 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
14fe0 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20  LE_NUMBER,      
14ff0 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d  /* IMP: R-38091-
15000 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54  32352 */.  SQLIT
15010 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
15020 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
15030 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
15040 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ,.};../*.** Make
15050 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c   sure the hard l
15060 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f  imits are set to
15070 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75   reasonable valu
15080 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  es.*/.#if SQLITE
15090 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _MAX_LENGTH<100.
150a0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
150b0 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  AX_LENGTH must b
150c0 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
150d0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
150e0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c  _MAX_SQL_LENGTH<
150f0 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
15100 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
15110 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
15120 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
15130 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
15140 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d  _LENGTH>SQLITE_M
15150 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f  AX_LENGTH.# erro
15160 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
15170 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74  _LENGTH must not
15180 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
15190 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
151a0 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  TH.#endif.#if SQ
151b0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
151c0 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72  D_SELECT<2.# err
151d0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
151e0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75  MPOUND_SELECT mu
151f0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32  st be at least 2
15200 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
15210 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34  TE_MAX_VDBE_OP<4
15220 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
15230 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73  _MAX_VDBE_OP mus
15240 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30  t be at least 40
15250 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
15260 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
15270 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ARG<0 || SQLITE_
15280 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
15290 3e 31 32 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  >127.# error SQL
152a0 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
152b0 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
152c0 77 65 65 6e 20 30 20 61 6e 64 20 31 32 37 0a 23  ween 0 and 127.#
152d0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
152e0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20  _MAX_ATTACHED<0 
152f0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  || SQLITE_MAX_AT
15300 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72  TACHED>125.# err
15310 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  or SQLITE_MAX_AT
15320 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62  TACHED must be b
15330 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35  etween 0 and 125
15340 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
15350 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
15360 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65  ERN_LENGTH<1.# e
15370 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
15380 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
15390 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
153a0 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69  east 1.#endif.#i
153b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
153c0 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f  UMN>32767.# erro
153d0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  r SQLITE_MAX_COL
153e0 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63  UMN must not exc
153f0 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66  eed 32767.#endif
15400 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15410 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a  TRIGGER_DEPTH<1.
15420 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
15430 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
15440 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
15450 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
15460 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
15470 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51  _THREADS<0 || SQ
15480 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
15490 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72  THREADS>50.# err
154a0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  or SQLITE_MAX_WO
154b0 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73  RKER_THREADS mus
154c0 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
154d0 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  nd 50.#endif.../
154e0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
154f0 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74  value of a limit
15500 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c  .  Report the ol
15510 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61  d value..** If a
15520 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20  n invalid limit 
15530 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65  index is supplie
15540 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a  d, report -1..**
15550 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
15560 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72   but still repor
15570 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  t the old value 
15580 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69  if the.** new li
15590 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
155a0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77  .**.** A new low
155b0 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f  er limit does no
155c0 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e  t shrink existin
155d0 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a  g constructs..**
155e0 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65   It merely preve
155f0 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63  nts new construc
15600 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74  ts that exceed t
15610 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d  he limit.** from
15620 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   forming..*/.int
15630 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73   sqlite3_limit(s
15640 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
15650 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77  limitId, int new
15660 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c  Limit){.  int ol
15670 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20  dLimit;..#ifdef 
15680 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
15690 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
156a0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
156b0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
156c0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
156d0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
156e0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  urn -1;.  }.#end
156f0 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  if..  /* EVIDENC
15700 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34  E-OF: R-30189-54
15710 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d  097 For each lim
15720 69 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49  it category SQLI
15730 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20  TE_LIMIT_NAME.  
15740 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61  ** there is a ha
15750 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73  rd upper bound s
15760 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  et at compile-ti
15770 6d 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f  me by a C prepro
15780 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72  cessor.  ** macr
15790 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f  o called SQLITE_
157a0 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22  MAX_NAME. (The "
157b0 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20  _LIMIT_" in the 
157c0 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20  name is changed 
157d0 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e  to.  ** "_MAX_".
157e0 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
157f0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15800 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
15810 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  ==SQLITE_MAX_LEN
15820 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
15830 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15840 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
15850 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  GTH]==SQLITE_MAX
15860 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _SQL_LENGTH );. 
15870 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
15880 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
15890 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45  _COLUMN]==SQLITE
158a0 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _MAX_COLUMN );. 
158b0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
158c0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
158d0 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51  _EXPR_DEPTH]==SQ
158e0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
158f0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
15900 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15910 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
15920 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54  D_SELECT]==SQLIT
15930 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
15940 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74  ELECT);.  assert
15950 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15960 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
15970 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  P]==SQLITE_MAX_V
15980 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65  DBE_OP );.  asse
15990 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
159a0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
159b0 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54  TION_ARG]==SQLIT
159c0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
159d0 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RG );.  assert( 
159e0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
159f0 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
15a00 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ]==SQLITE_MAX_AT
15a10 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65  TACHED );.  asse
15a20 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
15a30 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
15a40 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
15a50 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ==.             
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
15a90 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
15aa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15ab0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15ac0 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
15ad0 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d  UMBER]==SQLITE_M
15ae0 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
15af0 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ER);.  assert( a
15b00 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15b10 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
15b20 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  EPTH]==SQLITE_MA
15b30 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
15b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15b50 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15b60 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
15b70 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ADS]==SQLITE_MAX
15b80 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
15b90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
15ba0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
15bb0 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54  _THREADS==(SQLIT
15bc0 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a  E_N_LIMIT-1) );.
15bd0 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c  ..  if( limitId<
15be0 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51  0 || limitId>=SQ
15bf0 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a  LITE_N_LIMIT ){.
15c00 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
15c10 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20   }.  oldLimit = 
15c20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74  db->aLimit[limit
15c30 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69  Id];.  if( newLi
15c40 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20  mit>=0 ){       
15c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15c60 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33  MP: R-52476-2873
15c70 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77  2 */.    if( new
15c80 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74  Limit>aHardLimit
15c90 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20  [limitId] ){.   
15ca0 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48     newLimit = aH
15cb0 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
15cc0 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ];  /* IMP: R-51
15cd0 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20  463-25634 */.   
15ce0 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69   }.    db->aLimi
15cf0 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77  t[limitId] = new
15d00 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Limit;.  }.  ret
15d10 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20  urn oldLimit;   
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34    /* IMP: R-5334
15d40 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a  1-35419 */.}../*
15d50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
15d60 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72  n is used to par
15d70 73 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64  se both URIs and
15d80 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d   non-URI filenam
15d90 65 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65  es passed by the
15da0 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20  .** user to API 
15db0 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65  functions sqlite
15dc0 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  3_open() or sqli
15dd0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61  te3_open_v2(), a
15de0 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a  nd for database.
15df0 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65  ** URIs specifie
15e00 64 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54  d as part of ATT
15e10 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ACH statements..
15e20 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
15e30 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
15e40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
15e50 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
15e60 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61   to use (or.** a
15e70 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79   NULL to signify
15e80 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
15e90 29 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65  ) if the URI doe
15ea0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
15eb0 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65  "vfs=xxx".** que
15ec0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  ry parameter. Th
15ed0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15ee0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55  t contains the U
15ef0 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66  RI (or non-URI f
15f00 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65  ilename).** itse
15f10 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75  lf. When this fu
15f20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15f30 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72   the *pFlags var
15f40 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  iable should con
15f50 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61  tain.** the defa
15f60 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  ult flags to ope
15f70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
15f80 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20  andle with. The 
15f90 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
15fa0 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62  ** *pFlags may b
15fb0 65 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65  e updated before
15fc0 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68   returning if th
15fd0 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63  e URI filename c
15fe0 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63  ontains .** "cac
15ff0 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65  he=xxx" or "mode
16000 3d 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61  =xxx" query para
16010 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  meters..**.** If
16020 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
16030 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
16040 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
16050 20 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74   *ppVfs is set t
16060 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
16070 65 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c  e VFS that shoul
16080 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65  d be used to ope
16090 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
160a0 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20  ile. *pzFile is 
160b0 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20  set to.** point 
160c0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
160d0 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
160e0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f  of the file to o
160f0 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  pen. It is the .
16100 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
16110 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
16120 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  to eventually ca
16130 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
16140 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ) to release.** 
16150 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  this buffer..**.
16160 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
16170 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53  ccurs, then an S
16180 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
16190 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
161a0 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61   *pzErrMsg.** ma
161b0 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e  y be set to poin
161c0 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
161d0 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c  ntaining an Engl
161e0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
161f0 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20  or .** message. 
16200 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
16210 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
16220 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
16230 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ally release.** 
16240 74 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63  this buffer by c
16250 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  alling sqlite3_f
16260 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
16270 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20  lite3ParseUri(. 
16280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
16290 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20  faultVfs,       
162a0 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69   /* VFS to use i
162b0 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71  f no "vfs=xxx" q
162c0 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  uery option */. 
162d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
162e0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i,              
162f0 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74   /* Nul-terminat
16300 65 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20  ed URI to parse 
16310 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
16320 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20  t *pFlags,      
16330 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
16340 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
16350 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
16360 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20  e3_vfs **ppVfs, 
16370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16380 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  T: VFS to use */
16390 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c   .  char **pzFil
163a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
163b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65      /* OUT: File
163c0 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  name component o
163d0 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20  f URI */.  char 
163e0 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
163f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16400 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  T: Error message
16410 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f   (if rc!=SQLITE_
16420 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  OK) */.){.  int 
16430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16440 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
16450 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a  lags = *pFlags;.
16460 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
16470 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73  fs = zDefaultVfs
16480 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  ;.  char *zFile;
16490 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74  .  char c;.  int
164a0 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53   nUri = sqlite3S
164b0 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a  trlen30(zUri);..
164c0 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72    assert( *pzErr
164d0 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  Msg==0 );..  if(
164e0 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
164f0 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20  E_OPEN_URI)     
16500 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
16510 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f  R-48725-32206 */
16520 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
16530 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16540 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a  fig.bOpenUri) /*
16550 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36   IMP: R-51689-46
16560 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72  548 */.   && nUr
16570 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a  i>=5 && memcmp(z
16580 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29  Uri, "file:", 5)
16590 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37  ==0 /* IMP: R-57
165a0 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29  884-37496 */.  )
165b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74  {.    char *zOpt
165c0 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  ;.    int eState
165d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
165e0 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74      /* Parser st
165f0 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  ate when parsing
16600 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20   URI */.    int 
16610 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  iIn;            
16620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
16630 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
16640 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  ex */.    int iO
16650 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
16660 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
16670 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
16680 78 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79  x */.    u64 nBy
16690 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20  te = nUri+2;    
166a0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
166b0 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
166c0 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  cate */..    /* 
166d0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51  Make sure the SQ
166e0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c  LITE_OPEN_URI fl
166f0 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64  ag is set to ind
16700 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53  icate to the VFS
16710 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d   xOpen .    ** m
16720 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65  ethod that there
16730 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61   may be extra pa
16740 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69  rameters followi
16750 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65  ng the file-name
16760 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  .  */.    flags 
16770 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  |= SQLITE_OPEN_U
16780 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e  RI;..    for(iIn
16790 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49  =0; iIn<nUri; iI
167a0 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a  n++) nByte += (z
167b0 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a  Uri[iIn]=='&');.
167c0 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
167d0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
167e0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  te);.    if( !zF
167f0 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
16800 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
16810 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69  .    iIn = 5;.#i
16820 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  fdef SQLITE_ALLO
16830 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a  W_URI_AUTHORITY.
16840 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
16850 7a 55 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33  zUri+5, "///", 3
16860 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49  )==0 ){.      iI
16870 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20  n = 7;.      /* 
16880 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
16890 6e 64 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55  ndition causes U
168a0 52 49 73 20 77 69 74 68 20 66 69 76 65 20 6c 65  RIs with five le
168b0 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65  ading / characte
168c0 72 73 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65  rs.      ** like
168d0 20 66 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f   file://///host/
168e0 70 61 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65  path to be conve
168f0 72 74 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c  rted into UNCs l
16900 69 6b 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e  ike //host/path.
16910 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f  .      ** The co
16920 72 72 65 63 74 20 55 52 49 20 66 6f 72 20 74 68  rrect URI for th
16930 61 74 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20  at UNC has only 
16940 74 77 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64  two or four lead
16950 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73  ing / characters
16960 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f  .      ** file:/
16970 2f 68 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69  /host/path or fi
16980 6c 65 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68  le:////host/path
16990 2e 20 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67  .  But 5 leading
169a0 20 73 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20   slashes is a . 
169b0 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65       ** common e
169c0 72 72 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c  rror, we are tol
169d0 64 2c 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20  d, so we handle 
169e0 69 74 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  it as a special 
169f0 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  case. */.      i
16a00 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
16a10 37 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20  7, "///", 3)==0 
16a20 29 7b 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ){ iIn++; }.    
16a30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
16a40 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63  p(zUri+5, "//loc
16a50 61 6c 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30  alhost/", 12)==0
16a60 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
16a70 31 36 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  16;.    }.#else.
16a80 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
16a90 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75  he scheme and au
16aa0 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73  thority segments
16ab0 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a   of the URI. */.
16ac0 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d      if( zUri[5]=
16ad0 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d  ='/' && zUri[6]=
16ae0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='/' ){.      iI
16af0 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69  n = 7;.      whi
16b00 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
16b10 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20   zUri[iIn]!='/' 
16b20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69  ) iIn++;.      i
16b30 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49  f( iIn!=7 && (iI
16b40 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28  n!=16 || memcmp(
16b50 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55  "localhost", &zU
16b60 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20  ri[7], 9)) ){.  
16b70 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
16b80 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
16b90 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61  f("invalid uri a
16ba0 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c  uthority: %.*s",
16bb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49   .            iI
16bc0 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a  n-7, &zUri[7]);.
16bd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
16be0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
16bf0 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
16c00 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  i_out;.      }. 
16c10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
16c20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c   /* Copy the fil
16c30 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75  ename and any qu
16c40 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69  ery parameters i
16c50 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75  nto the zFile bu
16c60 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65  ffer. .    ** De
16c70 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20  code %HH escape 
16c80 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20  codes along the 
16c90 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  way. .    **.   
16ca0 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20   ** Within this 
16cb0 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65  loop, variable e
16cc0 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74  State may be set
16cd0 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64   to 0, 1 or 2, d
16ce0 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
16cf0 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63  on the parsing c
16d00 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f  ontext. As follo
16d10 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
16d20 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66  *   0: Parsing f
16d30 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a  ile-name..    **
16d40 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61     1: Parsing na
16d50 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  me section of a 
16d60 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
16d70 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
16d80 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20  **   2: Parsing 
16d90 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66  value section of
16da0 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
16db0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
16dc0 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65     */.    eState
16dd0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
16de0 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
16df0 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b  !=0 && c!='#' ){
16e00 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
16e10 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a      if( c=='%' .
16e20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
16e30 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
16e40 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20  In]) .       && 
16e50 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
16e60 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20  zUri[iIn+1]) .  
16e70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
16e80 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69  nt octet = (sqli
16e90 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
16ea0 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a  [iIn++]) << 4);.
16eb0 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d          octet +=
16ec0 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
16ed0 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a  (zUri[iIn++]);..
16ee0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16ef0 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65  octet>=0 && octe
16f00 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20  t<256 );.       
16f10 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b   if( octet==0 ){
16f20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16f30 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52  ENABLE_URI_00_ER
16f40 52 4f 52 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ROR.          /*
16f50 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
16f60 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22  taken when "%00"
16f70 20 61 70 70 65 61 72 73 20 77 69 74 68 69 6e 20   appears within 
16f80 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73  the URI. In this
16f90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
16fa0 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c  se we ignore all
16fb0 20 74 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d   text in the rem
16fc0 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61  ainder of the pa
16fd0 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20  th, name or.    
16fe0 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63        ** value c
16ff0 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70  urrently being p
17000 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65  arsed. So ignore
17010 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
17020 72 61 63 74 65 72 0a 20 20 20 20 20 20 20 20 20  racter.         
17030 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20   ** and skip to 
17040 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d  the next "?", "=
17050 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70  " or "&", as app
17060 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20  ropriate. */.   
17070 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
17080 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30   = zUri[iIn])!=0
17090 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20   && c!='#' .    
170a0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
170b0 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f  tate!=0 || c!='?
170c0 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ').             
170d0 20 26 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c   && (eState!=1 |
170e0 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d  | (c!='=' && c!=
170f0 27 26 27 29 29 0a 20 20 20 20 20 20 20 20 20 20  '&')).          
17100 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
17110 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20  2 || c!='&').   
17120 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
17130 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
17140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17150 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c     continue;.#el
17160 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se.          /* 
17170 49 66 20 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30  If ENABLE_URI_00
17180 5f 45 52 52 4f 52 20 69 73 20 64 65 66 69 6e 65  _ERROR is define
17190 64 2c 20 22 25 30 30 22 20 69 6e 20 61 20 55 52  d, "%00" in a UR
171a0 49 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a  I is an error. *
171b0 2f 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45  /.          *pzE
171c0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
171d0 6d 70 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63  mprintf("unexpec
171e0 74 65 64 20 25 25 30 30 20 69 6e 20 75 72 69 22  ted %%00 in uri"
171f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
17200 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
17210 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
17220 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 23 65  arse_uri_out;.#e
17230 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
17240 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74         c = octet
17250 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
17260 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28  ( eState==1 && (
17270 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27  c=='&' || c=='='
17280 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
17290 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d   zFile[iOut-1]==
172a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
172b0 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f  * An empty optio
172c0 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74  n name. Ignore t
172d0 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67  his option altog
172e0 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ether. */.      
172f0 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
17300 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
17310 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69  ]!='#' && zUri[i
17320 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e  In-1]!='&' ) iIn
17330 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
17340 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
17350 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
17360 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='&' ){.        
17370 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
17380 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
17390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
173a0 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20   eState = 2;.   
173b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
173c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
173d0 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30  e if( (eState==0
173e0 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28   && c=='?') || (
173f0 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d  eState==2 && c==
17400 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '&') ){.        
17410 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65  c = 0;.        e
17420 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
17430 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69   }.      zFile[i
17440 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
17450 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  }.    if( eState
17460 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74  ==1 ) zFile[iOut
17470 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
17480 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
17490 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
174a0 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
174b0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
174c0 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20   there were any 
174d0 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65  options specifie
174e0 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  d that should be
174f0 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20   interpreted .  
17500 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f    ** here. Optio
17510 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ns that are inte
17520 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63  rpreted here inc
17530 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74  lude "vfs" and t
17540 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  hose that.    **
17550 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66   correspond to f
17560 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65  lags that may be
17570 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
17580 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
17590 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20  .    ** method. 
175a0 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  */.    zOpt = &z
175b0 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  File[sqlite3Strl
175c0 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a  en30(zFile)+1];.
175d0 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b      while( zOpt[
175e0 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
175f0 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74  nOpt = sqlite3St
17600 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20  rlen30(zOpt);.  
17610 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d      char *zVal =
17620 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a   &zOpt[nOpt+1];.
17630 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d        int nVal =
17640 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17650 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69  (zVal);..      i
17660 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65  f( nOpt==3 && me
17670 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74  mcmp("vfs", zOpt
17680 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
17690 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a     zVfs = zVal;.
176a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
176b0 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e       struct Open
176c0 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20  Mode {.         
176d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
176e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
176f0 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61  de;.        } *a
17700 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mode = 0;.      
17710 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70    char *zModeTyp
17720 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
17730 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nt mask = 0;.   
17740 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
17750 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   0;..        if(
17760 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63   nOpt==5 && memc
17770 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74  mp("cache", zOpt
17780 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 5)==0 ){.     
17790 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
177a0 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63  ct OpenMode aCac
177b0 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  heMode[] = {.   
177c0 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72           { "shar
177d0 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ed",  SQLITE_OPE
177e0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
177f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
17800 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45  private", SQLITE
17810 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
17820 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
17830 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
17840 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
17850 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
17860 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
17870 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  E|SQLITE_OPEN_PR
17880 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20  IVATECACHE;.    
17890 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43        aMode = aC
178a0 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20  acheMode;.      
178b0 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
178c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
178d0 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b  eType = "cache";
178e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
178f0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26     if( nOpt==4 &
17900 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c  & memcmp("mode",
17910 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a   zOpt, 4)==0 ){.
17920 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
17930 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
17940 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b   aOpenMode[] = {
17950 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
17960 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ro",  SQLITE_OPE
17970 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
17980 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22            { "rw"
17990 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
179a0 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20  EADWRITE }, .   
179b0 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22           { "rwc"
179c0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
179d0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
179e0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
179f0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d              { "m
17a00 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f  emory", SQLITE_O
17a10 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20  PEN_MEMORY },.  
17a20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
17a30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
17a40 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
17a50 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
17a60 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f  ADONLY | SQLITE_
17a70 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
17aa0 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
17ab0 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20  OPEN_MEMORY;.   
17ac0 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
17ad0 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20  OpenMode;.      
17ae0 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
17af0 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   & flags;.      
17b00 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
17b10 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20  "access";.      
17b20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
17b30 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20   aMode ){.      
17b40 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
17b50 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20       int mode = 
17b60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
17b70 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a  (i=0; aMode[i].z
17b80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17b90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17ba0 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a  z = aMode[i].z;.
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
17bc0 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  nVal==sqlite3Str
17bd0 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d  len30(z) && 0==m
17be0 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e  emcmp(zVal, z, n
17bf0 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
17c00 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f        mode = aMo
17c10 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20  de[i].mode;.    
17c20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
17c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
17c40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17c50 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30       if( mode==0
17c60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17c70 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
17c80 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
17c90 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73  such %s mode: %s
17ca0 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56  ", zModeType, zV
17cb0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
17cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
17cd0 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
17ce0 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
17cf0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
17d00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d            if( (m
17d10 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ode & ~SQLITE_OP
17d20 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74  EN_MEMORY)>limit
17d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17d40 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
17d50 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
17d60 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  mode not allowed
17d70 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
17da0 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
17db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17dc0 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  = SQLITE_PERM;. 
17dd0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
17de0 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
17df0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17e00 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c       flags = (fl
17e10 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d  ags & ~mask) | m
17e20 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ode;.        }. 
17e30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f       }..      zO
17e40 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b  pt = &zVal[nVal+
17e50 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  1];.    }..  }el
17e60 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  se{.    zFile = 
17e70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
17e80 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66  (nUri+2);.    if
17e90 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
17ea0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
17eb0 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 55 72  KPT;.    if( nUr
17ec0 69 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  i ){.      memcp
17ed0 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e  y(zFile, zUri, n
17ee0 55 72 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Uri);.    }.    
17ef0 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c  zFile[nUri] = '\
17f00 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55  0';.    zFile[nU
17f10 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ri+1] = '\0';.  
17f20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
17f30 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d  TE_OPEN_URI;.  }
17f40 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c  ..  *ppVfs = sql
17f50 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56  ite3_vfs_find(zV
17f60 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66  fs);.  if( *ppVf
17f70 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45  s==0 ){.    *pzE
17f80 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17f90 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
17fa0 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29   vfs: %s", zVfs)
17fb0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
17fc0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61  E_ERROR;.  }. pa
17fd0 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69  rse_uri_out:.  i
17fe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17ff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18000 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  free(zFile);.   
18010 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a   zFile = 0;.  }.
18020 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67    *pFlags = flag
18030 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a  s;.  *pzFile = z
18040 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  File;.  return r
18050 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
18060 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
18070 45 43 29 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  EC)./*.** Proces
18080 73 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 71  s URI filename q
18090 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
180a0 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 65 20  relevant to the 
180b0 53 51 4c 69 74 65 20 45 6e 63 72 79 70 74 69 6f  SQLite Encryptio
180c0 6e 0a 2a 2a 20 45 78 74 65 6e 73 69 6f 6e 2e 20  n.** Extension. 
180d0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
180e0 61 6e 79 20 6f 66 20 74 68 65 20 72 65 6c 65 76  any of the relev
180f0 61 6e 74 20 71 75 65 72 79 20 70 61 72 61 6d 65  ant query parame
18100 74 65 72 73 20 61 72 65 0a 2a 2a 20 73 65 65 6e  ters are.** seen
18110 20 61 6e 64 20 72 65 74 75 72 6e 20 66 61 6c 73   and return fals
18120 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74  e if not..*/.int
18130 20 73 71 6c 69 74 65 33 43 6f 64 65 63 51 75 65   sqlite3CodecQue
18140 72 79 50 61 72 61 6d 65 74 65 72 73 28 0a 20 20  ryParameters(.  
18150 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
18160 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18170 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18180 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18190 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 57 68 69  Db,       /* Whi
181a0 63 68 20 73 63 68 65 6d 61 20 69 73 20 62 65 69  ch schema is bei
181b0 6e 67 20 63 72 65 61 74 65 64 2f 61 74 74 61 63  ng created/attac
181c0 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hed */.  const c
181d0 68 61 72 20 2a 7a 55 72 69 20 20 20 20 20 20 20  har *zUri       
181e0 2f 2a 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20  /* URI filename 
181f0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
18200 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 66 28 20  ar *zKey;.  if( 
18210 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
18220 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 55  uri_parameter(zU
18230 72 69 2c 20 22 68 65 78 6b 65 79 22 29 29 21 3d  ri, "hexkey"))!=
18240 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20 29 7b 0a  0 && zKey[0] ){.
18250 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20      u8 iByte;.  
18260 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61    int i;.    cha
18270 72 20 7a 44 65 63 6f 64 65 64 5b 34 30 5d 3b 0a  r zDecoded[40];.
18280 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79      for(i=0, iBy
18290 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a  te=0; i<sizeof(z
182a0 44 65 63 6f 64 65 64 29 2a 32 20 26 26 20 73 71  Decoded)*2 && sq
182b0 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 4b  lite3Isxdigit(zK
182c0 65 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ey[i]); i++){.  
182d0 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42 79      iByte = (iBy
182e0 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33  te<<4) + sqlite3
182f0 48 65 78 54 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d  HexToInt(zKey[i]
18300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 26  );.      if( (i&
18310 31 29 21 3d 30 20 29 20 7a 44 65 63 6f 64 65 64  1)!=0 ) zDecoded
18320 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20  [i/2] = iByte;. 
18330 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
18340 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  _key_v2(db, zDb,
18350 20 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32 29 3b   zDecoded, i/2);
18360 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
18370 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 4b 65 79   }else if( (zKey
18380 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
18390 61 72 61 6d 65 74 65 72 28 7a 55 72 69 2c 20 22  arameter(zUri, "
183a0 6b 65 79 22 29 29 21 3d 30 20 29 7b 0a 20 20 20  key"))!=0 ){.   
183b0 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28   sqlite3_key_v2(
183c0 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 73  db, zDb, zKey, s
183d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
183e0 4b 65 79 29 29 3b 0a 20 20 20 20 72 65 74 75 72  Key));.    retur
183f0 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 1;.  }else if(
18400 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   (zKey = sqlite3
18410 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
18420 55 72 69 2c 20 22 74 65 78 74 6b 65 79 22 29 29  Uri, "textkey"))
18430 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
18440 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44  e3_key_v2(db, zD
18450 62 2c 20 7a 4b 65 79 2c 20 2d 31 29 3b 0a 20 20  b, zKey, -1);.  
18460 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
18470 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
18480 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
18490 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
184a0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f  tine does the wo
184b0 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20  rk of opening a 
184c0 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61  database on beha
184d0 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lf of.** sqlite3
184e0 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69  _open() and sqli
184f0 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68  te3_open16(). Th
18500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  e database filen
18510 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20  ame "zFilename" 
18520 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e   .** is UTF-8 en
18530 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
18540 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73   int openDatabas
18550 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
18560 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44  *zFilename, /* D
18570 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
18580 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a   UTF-8 encoded *
18590 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
185a0 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  Db,        /* OU
185b0 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61  T: Returned data
185c0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
185d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
185e0 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61  ags,    /* Opera
185f0 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a  tional flags */.
18600 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
18610 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  fs       /* Name
18620 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
18630 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  se */.){.  sqlit
18640 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
18650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
18660 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61  ore allocated ha
18670 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
18680 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
186a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
186b0 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73  .  int isThreads
186c0 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  afe;            
186d0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
186e0 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63  hreadsafe connec
186f0 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  tions */.  char 
18700 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20  *zOpen = 0;     
18710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18720 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
18730 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65  to pass to Btree
18740 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72  Open() */.  char
18750 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20   *zErrMsg = 0;  
18760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18770 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
18780 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  m sqlite3ParseUr
18790 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  i() */..#ifdef S
187a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
187b0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44  _ARMOR.  if( ppD
187c0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  b==0 ) return SQ
187d0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
187e0 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62  ;.#endif.  *ppDb
187f0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
18800 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
18810 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
18820 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
18830 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
18840 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
18850 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
18860 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
18870 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54  ex==0 ){.    isT
18880 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
18890 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
188a0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e   & SQLITE_OPEN_N
188b0 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73  OMUTEX ){.    is
188c0 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
188d0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
188e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
188f0 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20  FULLMUTEX ){.   
18900 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
18910 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
18920 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73  isThreadsafe = s
18930 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18940 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20  ig.bFullMutex;. 
18950 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20   }..  if( flags 
18960 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  & SQLITE_OPEN_PR
18970 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20  IVATECACHE ){.  
18980 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
18990 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
189a0 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CHE;.  }else if(
189b0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
189c0 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
189d0 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66  Enabled ){.    f
189e0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
189f0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
18a00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
18a10 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66  e harmful bits f
18a20 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61  rom the flags pa
18a30 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a  rameter.  **.  *
18a40 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  * The SQLITE_OPE
18a50 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51  N_NOMUTEX and SQ
18a60 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
18a70 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20  TEX flags were. 
18a80 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69   ** dealt with i
18a90 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
18aa0 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69  ode block.  Besi
18ab0 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f  des these, the o
18ac0 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69  nly.  ** valid i
18ad0 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73  nput flags for s
18ae0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
18af0 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   are SQLITE_OPEN
18b00 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20  _READONLY,.  ** 
18b10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18b20 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  WRITE, SQLITE_OP
18b30 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54  EN_CREATE, SQLIT
18b40 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
18b50 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  HE,.  ** SQLITE_
18b60 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
18b70 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65  E, and some rese
18b80 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65  rved bits.  Sile
18b90 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
18ba0 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
18bb0 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
18bc0 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
18bd0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
18be0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
18bf0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
18c00 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
18c10 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18c20 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18c40 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
18c50 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
18c60 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18c70 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
18c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18c90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
18ca0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
18cb0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18cc0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
18cd0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
18ce0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18cf0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18d10 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
18d20 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
18d30 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18d40 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
18d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
18d70 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
18d80 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18d90 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
18da0 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
18db0 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
18dc0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
18dd0 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
18de0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
18df0 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
18e00 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
18e10 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
18e20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
18e30 65 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e .#ifdef SQLITE
18e40 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 54 48 52  _ENABLE_MULTITHR
18e50 45 41 44 45 44 5f 43 48 45 43 4b 53 0a 20 20 20  EADED_CHECKS.   
18e60 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
18e70 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
18e80 78 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  x.#endif.  ){.  
18e90 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71    db->mutex = sq
18ea0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
18eb0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
18ec0 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28  URSIVE);.    if(
18ed0 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b   db->mutex==0 ){
18ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
18ef0 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64  ree(db);.      d
18f00 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74  b = 0;.      got
18f10 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
18f20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 54 68    }.    if( isTh
18f30 72 65 61 64 73 61 66 65 3d 3d 30 20 29 7b 0a 20  readsafe==0 ){. 
18f40 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65       sqlite3Mute
18f50 78 57 61 72 6e 4f 6e 43 6f 6e 74 65 6e 74 69 6f  xWarnOnContentio
18f60 6e 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  n(db->mutex);.  
18f70 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18f80 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
18f90 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
18fa0 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a  errMask = 0xff;.
18fb0 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20    db->nDb = 2;. 
18fc0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
18fd0 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
18fe0 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
18ff0 61 44 62 53 74 61 74 69 63 3b 0a 20 20 64 62 2d  aDbStatic;.  db-
19000 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
19010 62 6c 65 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74  ble = 1;.  sqlit
19020 65 33 46 61 73 74 50 72 6e 67 49 6e 69 74 28 26  e3FastPrngInit(&
19030 64 62 2d 3e 73 50 72 6e 67 29 3b 0a 20 20 61 73  db->sPrng);.  as
19040 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d  sert( sizeof(db-
19050 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66  >aLimit)==sizeof
19060 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a  (aHardLimit) );.
19070 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69    memcpy(db->aLi
19080 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c  mit, aHardLimit,
19090 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
190a0 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d  it));.  db->aLim
190b0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
190c0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20  WORKER_THREADS] 
190d0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
190e0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b  _WORKER_THREADS;
190f0 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
19100 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78  t = 1;.  db->nex
19110 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20  tAutovac = -1;. 
19120 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71   db->szMmap = sq
19130 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19140 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e  g.szMmap;.  db->
19150 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30  nextPagesize = 0
19160 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74  ;.  db->nMaxSort
19170 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46  erMmap = 0x7FFFF
19180 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  FFF;.  db->flags
19190 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
191a0 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54  ColNames | SQLIT
191b0 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20  E_EnableTrigger 
191c0 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70  | SQLITE_CacheSp
191d0 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ill.#if !defined
191e0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
191f0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29  AUTOMATIC_INDEX)
19200 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   || SQLITE_DEFAU
19210 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  LT_AUTOMATIC_IND
19220 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EX.             
19230 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74      | SQLITE_Aut
19240 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69  oIndex.#endif.#i
19250 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
19260 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20  _CKPTFULLFSYNC. 
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19280 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c  | SQLITE_CkptFul
19290 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69  lFSync.#endif.#i
192a0 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
192b0 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20  _FILE_FORMAT<4. 
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  | SQLITE_LegacyF
192e0 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69  ileFmt.#endif.#i
192f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19300 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
19310 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
19320 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64     | SQLITE_Load
19330 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66  Extension.#endif
19340 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
19350 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52  ULT_RECURSIVE_TR
19360 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20  IGGERS.         
19370 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
19380 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e  _RecTriggers.#en
19390 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
193a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
193b0 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20  OREIGN_KEYS) && 
193c0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
193d0 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20  OREIGN_KEYS.    
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
193f0 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
19400 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  s.#endif.#if def
19410 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45  ined(SQLITE_REVE
19420 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45  RSE_UNORDERED_SE
19430 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20 20 20  LECTS).         
19440 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
19450 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65  _ReverseOrder.#e
19460 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
19470 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
19480 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
19490 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK).            
194a0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65       | SQLITE_Ce
194b0 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a  llSizeCk.#endif.
194c0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
194d0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54  TE_ENABLE_FTS3_T
194e0 4f 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20 20 20  OKENIZER).      
194f0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
19500 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65  ITE_Fts3Tokenize
19510 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  r.#endif.#if def
19520 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
19530 4c 45 5f 51 50 53 47 29 0a 20 20 20 20 20 20 20  LE_QPSG).       
19540 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
19550 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a 23 65  TE_EnableQPSG.#e
19560 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
19570 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
19580 44 45 46 45 4e 53 49 56 45 29 0a 20 20 20 20 20  DEFENSIVE).     
19590 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
195a0 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 0a 23  LITE_Defensive.#
195b0 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
195c0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
195d0 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
195e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
195f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
19600 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
19610 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
19620 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
19630 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
19640 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19650 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
19660 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
19670 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
19680 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
19690 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
196a0 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
196b0 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
196c0 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
196d0 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
196e0 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
196f0 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
19700 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lure..  **.  ** 
19710 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19720 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74  2786-44878 SQLit
19730 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20  e defines three 
19740 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
19750 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ng.  ** function
19760 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  s:.  */.  create
19770 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
19780 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
19790 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
197a0 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
197b0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
197c0 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
197d0 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
197e0 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43  UTF16BE, 0, binC
197f0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
19800 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
19810 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  b, sqlite3StrBIN
19820 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ARY, SQLITE_UTF1
19830 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6LE, 0, binCollF
19840 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
19850 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
19860 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
19870 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
19880 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
19890 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
198a0 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
198b0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
198c0 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46  oid*)1, binCollF
198d0 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  unc, 0);.  if( d
198e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
198f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
19900 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a  db_out;.  }.  /*
19910 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19920 30 38 33 30 38 2d 31 37 32 32 34 20 54 68 65 20  08308-17224 The 
19930 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
19940 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  g function for a
19950 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  ll.  ** strings 
19960 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f  is BINARY. .  */
19970 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  .  db->pDfltColl
19980 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
19990 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
199a0 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74  _UTF8, sqlite3St
199b0 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61  rBINARY, 0);.  a
199c0 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74  ssert( db->pDflt
199d0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Coll!=0 );..  /*
199e0 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e   Parse the filen
199f0 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74  ame/URI argument
19a00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20  .  **.  ** Only 
19a10 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
19a20 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
19a30 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
19a40 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
19a50 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
19a60 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
19a70 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
19a80 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
19a90 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
19aa0 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
19ab0 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
19ac0 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
19ad0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
19ae0 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
19af0 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
19b00 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
19b10 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
19b20 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
19b30 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
19b40 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
19b50 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
19b60 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
19b70 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
19b80 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
19b90 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  .  */.  db->open
19ba0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
19bb0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
19bc0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
19bd0 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
19be0 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
19bf0 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
19c00 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
19c10 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
19c20 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
19c30 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
19c40 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
19c50 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
19c60 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
19c70 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
19c80 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
19c90 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
19ca0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
19cb0 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
19cc0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
19cd0 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
19ce0 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
19cf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
19d00 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
19d10 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  KPT;  /* IMP: R-
19d20 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20  65497-44594 */. 
19d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
19d40 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
19d50 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
19d60 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
19d70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
19d80 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66  rrMsg);.  }.  if
19d90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19da0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
19db0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71  QLITE_NOMEM ) sq
19dc0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
19dd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  );.    sqlite3Er
19de0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
19df0 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  c, zErrMsg ? "%s
19e00 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b  " : 0, zErrMsg);
19e10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
19e20 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
19e30 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
19e40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
19e50 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
19e60 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
19e70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
19e80 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
19e90 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d   zOpen, db, &db-
19ea0 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a  >aDb[0].pBt, 0,.
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ec0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
19ed0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
19ee0 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  _DB);.  if( rc!=
19ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19f00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19f10 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
19f20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19f30 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
19f40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
19f50 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20  ror(db, rc);.   
19f60 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
19f70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
19f80 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44  treeEnter(db->aD
19f90 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
19fa0 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
19fb0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
19fc0 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
19fd0 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64  ].pBt);.  if( !d
19fe0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19ff0 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45  ) ENC(db) = SCHE
1a000 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71  MA_ENC(db);.  sq
1a010 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a020 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
1a030 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
1a040 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
1a050 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
1a060 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
1a070 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
1a080 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
1a090 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66  abase is FULL; f
1a0a0 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a  or the temp.  **
1a0b0 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20   database it is 
1a0c0 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65  OFF. This matche
1a0d0 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  s the pager laye
1a0e0 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20  r defaults.  .  
1a0f0 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  */.  db->aDb[0].
1a100 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  zDbSName = "main
1a110 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ";.  db->aDb[0].
1a120 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53  safety_level = S
1a130 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
1a140 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64  NCHRONOUS+1;.  d
1a150 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61  b->aDb[1].zDbSNa
1a160 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64  me = "temp";.  d
1a170 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79  b->aDb[1].safety
1a180 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52 5f 53  _level = PAGER_S
1a190 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a  YNCHRONOUS_OFF;.
1a1a0 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
1a1b0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
1a1c0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1a1d0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1a1e0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
1a1f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
1a200 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
1a210 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
1a220 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
1a230 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
1a240 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
1a250 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
1a260 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
1a270 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
1a280 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
1a290 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
1a2a0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
1a2b0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
1a2c0 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 50 65  qlite3RegisterPe
1a2d0 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74  rConnectionBuilt
1a2e0 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
1a2f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1a300 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23 69  errcode(db);..#i
1a310 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a320 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65 67  LE_FTS5.  /* Reg
1a330 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c 74 2d  ister any built-
1a340 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 62  in FTS5 module b
1a350 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74 68  efore loading th
1a360 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a 2a  e automatic.  **
1a370 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68 69   extensions. Thi
1a380 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61 74  s allows automat
1a390 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f  ic extensions to
1a3a0 20 72 65 67 69 73 74 65 72 20 46 54 53 35 20 0a   register FTS5 .
1a3b0 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73 20    ** tokenizers 
1a3c0 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20 66 75  and auxiliary fu
1a3d0 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69  nctions.  */.  i
1a3e0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1a3f0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1a400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1a410 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69  = sqlite3Fts5Ini
1a420 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
1a430 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74  f..  /* Load aut
1a440 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
1a450 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  s - extensions t
1a460 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  hat have been re
1a470 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73  gistered.  ** us
1a480 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
1a490 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73  automatic_extens
1a4a0 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a  ion() API..  */.
1a4b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a4c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1a4d0 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73  e3AutoLoadExtens
1a4e0 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63  ions(db);.    rc
1a4f0 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
1a500 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  de(db);.    if( 
1a510 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a520 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
1a530 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
1a540 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1a550 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69  _ENABLE_FTS1.  i
1a560 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1a570 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65  iled ){.    exte
1a580 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
1a590 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s1Init(sqlite3*)
1a5a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a5b0 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a  e3Fts1Init(db);.
1a5c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1a5d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a5e0 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d  _FTS2.  if( !db-
1a5f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1a600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a610 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
1a620 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
1a630 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
1a640 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32  rc = sqlite3Fts2
1a650 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1a660 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1a670 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20  ITE_ENABLE_FTS3 
1a680 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  /* automatically
1a690 20 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49   defined by SQLI
1a6a0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a  TE_ENABLE_FTS4 *
1a6b0 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  /.  if( !db->mal
1a6c0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1a6d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a6e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
1a6f0 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
1a700 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1a710 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1a720 45 5f 49 43 55 29 20 7c 7c 20 64 65 66 69 6e 65  E_ICU) || define
1a730 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1a740 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a  ICU_COLLATIONS).
1a750 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a760 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a780 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49  rc = sqlite3IcuI
1a790 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1a7a0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1a7b0 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
1a7c0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a7d0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a7e0 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
1a7f0 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65  c = sqlite3Rtree
1a800 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1a810 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1a820 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
1a830 45 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64 62  E_VTAB.  if( !db
1a840 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
1a850 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
1a860 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1a870 65 33 44 62 70 61 67 65 52 65 67 69 73 74 65 72  e3DbpageRegister
1a880 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1a890 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a8a0 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54  ENABLE_DBSTAT_VT
1a8b0 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  AB.  if( !db->ma
1a8c0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1a8d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
1a8e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62    rc = sqlite3Db
1a8f0 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29  statRegister(db)
1a900 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1a910 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a920 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21  LE_JSON1.  if( !
1a930 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a940 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a950 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
1a960 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62  ite3Json1Init(db
1a970 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a990 42 4c 45 5f 53 54 4d 54 56 54 41 42 0a 20 20 69  BLE_STMTVTAB.  i
1a9a0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1a9b0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1a9c0 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
1a9d0 20 73 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62   sqlite3StmtVtab
1a9e0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1a9f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c  ndif..  /* -DSQL
1aa00 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
1aa10 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73  ING_MODE=1 makes
1aa20 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64   EXCLUSIVE the d
1aa30 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
1aa40 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c   ** mode.  -DSQL
1aa50 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
1aa60 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20  ING_MODE=0 make 
1aa70 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
1aa80 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
1aa90 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74  mode.  Doing not
1aaa0 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f  hing at all also
1aab0 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68   makes NORMAL th
1aac0 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  e default..  */.
1aad0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1aae0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
1aaf0 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  DE.  db->dfltLoc
1ab00 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44  kMode = SQLITE_D
1ab10 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
1ab20 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ODE;.  sqlite3Pa
1ab30 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73  gerLockingMode(s
1ab40 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1ab50 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
1ab60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1ab80 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
1ab90 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66  NG_MODE);.#endif
1aba0 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c  ..  if( rc ) sql
1abb0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
1abc0 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20  );..  /* Enable 
1abd0 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61  the lookaside-ma
1abe0 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a  lloc subsystem *
1abf0 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  /.  setupLookasi
1ac00 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65  de(db, 0, sqlite
1ac10 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
1ac20 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20  Lookaside,.     
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac40 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1ac50 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
1ac60 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77  e);..  sqlite3_w
1ac70 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
1ac80 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46  t(db, SQLITE_DEF
1ac90 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45  AULT_WAL_AUTOCHE
1aca0 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64  CKPOINT);..opend
1acb0 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20  b_out:.  if( db 
1acc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
1acd0 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69  b->mutex!=0 || i
1ace0 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20  sThreadsafe==0. 
1acf0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
1ad00 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ad10 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
1ad20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
1ad30 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1ad40 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tex);.  }.  rc =
1ad50 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1ad60 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
1ad70 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  db!=0 || rc==SQL
1ad80 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69  ITE_NOMEM );.  i
1ad90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
1ada0 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MEM ){.    sqlit
1adb0 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
1adc0 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    db = 0;.  }els
1add0 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
1ade0 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  _OK ){.    db->m
1adf0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1ae00 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20  GIC_SICK;.  }.  
1ae10 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64  *ppDb = db;.#ifd
1ae20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ae30 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
1ae40 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ae50 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
1ae60 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62   /* Opening a db
1ae70 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
1ae80 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
1ae90 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f  sed 0. */.    vo
1aea0 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74  id *pArg = sqlit
1aeb0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1aec0 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73  SqllogArg;.    s
1aed0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aee0 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c  ig.xSqllog(pArg,
1aef0 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   db, zFilename, 
1af00 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  0);.  }.#endif.#
1af10 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1af20 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69  E_HAS_CODEC).  i
1af30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1af40 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 63 51   ) sqlite3CodecQ
1af50 75 65 72 79 50 61 72 61 6d 65 74 65 72 73 28 64  ueryParameters(d
1af60 62 2c 20 30 2c 20 7a 4f 70 65 6e 29 3b 0a 23 65  b, 0, zOpen);.#e
1af70 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
1af80 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65  ree(zOpen);.  re
1af90 74 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a  turn rc & 0xff;.
1afa0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  }.../*.** Open a
1afb0 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
1afc0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
1afd0 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e  ite3_open(.  con
1afe0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1aff0 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
1b000 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75  *ppDb .){.  retu
1b010 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
1b020 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  zFilename, ppDb,
1b030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b040 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b050 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1b060 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1b070 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  E, 0);.}.int sql
1b080 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20  ite3_open_v2(.  
1b090 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
1b0a0 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62  name,   /* Datab
1b0b0 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54  ase filename (UT
1b0c0 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
1b0d0 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20  3 **ppDb,       
1b0e0 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65    /* OUT: SQLite
1b0f0 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
1b100 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
1b110 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
1b120 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b130 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a   *zVfs        /*
1b140 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64   Name of VFS mod
1b150 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  ule to use */.){
1b160 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
1b170 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c  tabase(filename,
1b180 20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64   ppDb, (unsigned
1b190 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73   int)flags, zVfs
1b1a0 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1b1b0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1b1c0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
1b1d0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1b1e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b1f0 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74  _open16(.  const
1b200 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
1b210 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
1b220 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  pDb.){.  char co
1b230 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b  nst *zFilename8;
1b240 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1b250 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38  encoded in UTF-8
1b260 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d   instead of UTF-
1b270 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  16 */.  sqlite3_
1b280 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
1b290 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53  nt rc;..#ifdef S
1b2a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1b2b0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44  _ARMOR.  if( ppD
1b2c0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  b==0 ) return SQ
1b2d0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1b2e0 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62  ;.#endif.  *ppDb
1b2f0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
1b300 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
1b310 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
1b320 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
1b330 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1b340 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69  n rc;.#endif.  i
1b350 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
1b360 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c  ) zFilename = "\
1b370 30 30 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c  000\000";.  pVal
1b380 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
1b390 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
1b3a0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
1b3b0 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
1b3c0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
1b3d0 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  IVE, SQLITE_STAT
1b3e0 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  IC);.  zFilename
1b3f0 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  8 = sqlite3Value
1b400 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
1b410 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a  E_UTF8);.  if( z
1b420 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20  Filename8 ){.   
1b430 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61   rc = openDataba
1b440 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70  se(zFilename8, p
1b450 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
1b460 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1b470 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1b480 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
1b490 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61  REATE, 0);.    a
1b4a0 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20  ssert( *ppDb || 
1b4b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
1b4c0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1b4d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62  SQLITE_OK && !Db
1b4e0 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44  HasProperty(*ppD
1b4f0 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
1b500 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20  oaded) ){.      
1b510 53 43 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62  SCHEMA_ENC(*ppDb
1b520 29 20 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d  ) = ENC(*ppDb) =
1b530 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
1b540 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  IVE;.    }.  }el
1b550 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
1b560 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1b570 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c    }.  sqlite3Val
1b580 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
1b590 20 72 65 74 75 72 6e 20 72 63 20 26 20 30 78 66   return rc & 0xf
1b5a0 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  f;.}.#endif /* S
1b5b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1b5c0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
1b5d0 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
1b5e0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
1b5f0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
1b600 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
1b610 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1b620 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  collation(.  sql
1b630 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
1b640 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1b650 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
1b660 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
1b670 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
1b680 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
1b690 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
1b6a0 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  *).){.  return s
1b6b0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
1b6c0 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  llation_v2(db, z
1b6d0 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c  Name, enc, pCtx,
1b6e0 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d   xCompare, 0);.}
1b6f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
1b700 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
1b710 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
1b720 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
1b730 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
1b740 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
1b750 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  lation_v2(.  sql
1b760 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
1b770 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
1b780 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
1b790 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
1b7a0 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
1b7b0 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
1b7c0 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
1b7d0 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
1b7e0 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  )(void*).){.  in
1b7f0 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
1b800 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1b810 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1b820 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1b830 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
1b840 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1b850 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1b860 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1b870 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1b880 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
1b890 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1b8a0 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72  led );.  rc = cr
1b8b0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
1b8c0 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63  , zName, (u8)enc
1b8d0 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
1b8e0 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20  , xDel);.  rc = 
1b8f0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
1b900 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
1b910 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1b920 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1b930 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1b940 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1b950 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
1b960 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
1b970 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
1b980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1b990 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
1b9a0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
1b9b0 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71  ollation16(.  sq
1b9c0 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
1b9d0 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c  nst void *zName,
1b9e0 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
1b9f0 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
1ba00 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
1ba10 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
1ba20 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
1ba30 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *).){.  int rc =
1ba40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
1ba50 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66  ar *zName8;..#if
1ba60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ba70 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1ba80 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1ba90 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1baa0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
1bab0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1bac0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1bad0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1bae0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1baf0 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
1bb00 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
1bb10 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55  Name8 = sqlite3U
1bb20 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d  tf16to8(db, zNam
1bb30 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
1bb40 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66  F16NATIVE);.  if
1bb50 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ( zName8 ){.    
1bb60 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
1bb70 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c  tion(db, zName8,
1bb80 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
1bb90 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20  xCompare, 0);.  
1bba0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1bbb0 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d  db, zName8);.  }
1bbc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
1bbd0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
1bbe0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bbf0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1bc00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bc10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1bc20 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1bc30 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1bc40 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
1bc50 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
1bc60 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
1bc70 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
1bc80 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
1bc90 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
1bca0 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
1bcb0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
1bcc0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1bcd0 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
1bce0 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ed(.  sqlite3 *d
1bcf0 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
1bd00 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
1bd10 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
1bd20 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
1bd30 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
1bd40 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69  nst char*).){.#i
1bd50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1bd60 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1bd70 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1bd80 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1bd90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1bda0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1bdb0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1bdc0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1bdd0 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
1bde0 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  eded = xCollNeed
1bdf0 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ed;.  db->xCollN
1be00 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64  eeded16 = 0;.  d
1be10 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
1be20 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
1be30 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
1be40 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1be50 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1be60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1be70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1be80 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
1be90 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
1bea0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
1beb0 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
1bec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1bed0 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
1bee0 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
1bef0 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
1bf00 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1bf10 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
1bf20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
1bf30 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71  n_needed16(.  sq
1bf40 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
1bf50 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
1bf60 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
1bf70 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64  llNeeded16)(void
1bf80 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
1bf90 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f  TextRep,const vo
1bfa0 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53  id*).){.#ifdef S
1bfb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1bfc0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1bfd0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1bfe0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1bff0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1c000 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1c010 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1c020 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
1c030 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
1c040 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e   0;.  db->xCollN
1c050 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e  eeded16 = xCollN
1c060 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70  eeded16;.  db->p
1c070 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
1c080 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
1c090 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c0a0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1c0b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c0c0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
1c0d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1c0e0 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  F16 */..#ifndef 
1c0f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
1c100 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
1c110 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
1c120 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d  w an anachronism
1c130 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20  . It used to be 
1c140 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20  used to recover 
1c150 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63  from a.** malloc
1c160 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20  () failure, but 
1c170 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20  SQLite now does 
1c180 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  this automatical
1c190 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
1c1a0 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  e3_global_recove
1c1b0 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  r(void){.  retur
1c1c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1c1d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  endif../*.** Tes
1c1e0 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
1c1f0 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61   or not the data
1c200 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1c210 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
1c220 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72  .** mode.  Retur
1c230 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
1c240 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  and FALSE if not
1c250 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  .  Autocommit mo
1c260 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64  de is on.** by d
1c270 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d  efault.  Autocom
1c280 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20  mit is disabled 
1c290 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  by a BEGIN state
1c2a0 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c  ment and reenabl
1c2b0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78  ed.** by the nex
1c2c0 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  t COMMIT or ROLL
1c2d0 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  BACK..*/.int sql
1c2e0 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
1c2f0 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  mit(sqlite3 *db)
1c300 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1c310 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1c320 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1c330 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1c340 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
1c350 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1c360 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1c370 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
1c380 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  urn db->autoComm
1c390 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  it;.}../*.** The
1c3a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
1c3b0 6e 65 73 20 61 72 65 20 73 75 62 73 74 69 74 75  nes are substitu
1c3c0 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74  tes for constant
1c3d0 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
1c3e0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55  ,.** SQLITE_MISU
1c3f0 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  SE, SQLITE_CANTO
1c400 50 45 4e 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  PEN, SQLITE_NOME
1c410 4d 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f  M and possibly o
1c420 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  ther error.** co
1c430 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20 73  nstants.  They s
1c440 65 72 76 65 20 74 77 6f 20 70 75 72 70 6f 73 65  erve two purpose
1c450 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53  s:.**.**   1.  S
1c460 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e  erve as a conven
1c470 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
1c480 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69  t a breakpoint i
1c490 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  n a debugger.** 
1c4a0 20 20 20 20 20 20 74 6f 20 64 65 74 65 63 74 20        to detect 
1c4b0 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72  when version err
1c4c0 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63  or conditions oc
1c4d0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e  curs..**.**   2.
1c4e0 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33    Invoke sqlite3
1c4f0 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64  _log() to provid
1c500 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64  e the source cod
1c510 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65  e location where
1c520 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d  .**       a low-
1c530 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66  level error is f
1c540 69 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a  irst detected..*
1c550 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 70  /.int sqlite3Rep
1c560 6f 72 74 45 72 72 6f 72 28 69 6e 74 20 69 45 72  ortError(int iEr
1c570 72 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63  r, int lineno, c
1c580 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1c590 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ){.  sqlite3_log
1c5a0 28 69 45 72 72 2c 20 22 25 73 20 61 74 20 6c 69  (iErr, "%s at li
1c5b0 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
1c5c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c5d0 20 7a 54 79 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20   zType, lineno, 
1c5e0 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
1c5f0 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
1c600 20 69 45 72 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c   iErr;.}.int sql
1c610 69 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72  ite3CorruptError
1c620 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
1c630 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1c640 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1c650 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  og!=0 );.  retur
1c660 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45  n sqlite3ReportE
1c670 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52 52  rror(SQLITE_CORR
1c680 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 22 64 61  UPT, lineno, "da
1c690 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1c6a0 6e 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  n");.}.int sqlit
1c6b0 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e  e3MisuseError(in
1c6c0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1c6d0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1c6e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1c6f0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
1c700 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1c710 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  r(SQLITE_MISUSE,
1c720 20 6c 69 6e 65 6e 6f 2c 20 22 6d 69 73 75 73 65   lineno, "misuse
1c730 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ");.}.int sqlite
1c740 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69  3CantopenError(i
1c750 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1c760 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1c770 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1c780 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1c790 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72  sqlite3ReportErr
1c7a0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
1c7b0 45 4e 2c 20 6c 69 6e 65 6e 6f 2c 20 22 63 61 6e  EN, lineno, "can
1c7c0 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 22 29 3b  not open file");
1c7d0 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
1c7e0 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
1c7f0 65 33 43 6f 72 72 75 70 74 50 67 6e 6f 45 72 72  e3CorruptPgnoErr
1c800 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 50  or(int lineno, P
1c810 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 63 68 61  gno pgno){.  cha
1c820 72 20 7a 4d 73 67 5b 31 30 30 5d 3b 0a 20 20 73  r zMsg[100];.  s
1c830 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1c840 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d  sizeof(zMsg), zM
1c850 73 67 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f  sg, "database co
1c860 72 72 75 70 74 69 6f 6e 20 70 61 67 65 20 25 64  rruption page %d
1c870 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74  ", pgno);.  test
1c880 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1c890 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1c8a0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
1c8b0 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1c8c0 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c  (SQLITE_CORRUPT,
1c8d0 20 6c 69 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a   lineno, zMsg);.
1c8e0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 6d  }.int sqlite3Nom
1c8f0 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  emError(int line
1c900 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1c910 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1c920 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1c930 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1c940 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  ReportError(SQLI
1c950 54 45 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f  TE_NOMEM, lineno
1c960 2c 20 22 4f 4f 4d 22 29 3b 0a 7d 0a 69 6e 74 20  , "OOM");.}.int 
1c970 73 71 6c 69 74 65 33 49 6f 65 72 72 6e 6f 6d 65  sqlite3Ioerrnome
1c980 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  mError(int linen
1c990 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1c9a0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c9b0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1c9c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1c9d0 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1c9e0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c  E_IOERR_NOMEM, l
1c9f0 69 6e 65 6e 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20  ineno, "I/O OOM 
1ca00 65 72 72 6f 72 22 29 3b 0a 7d 0a 23 65 6e 64 69  error");.}.#endi
1ca10 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1ca20 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1ca30 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  D./*.** This is 
1ca40 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f  a convenience ro
1ca50 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73  utine that makes
1ca60 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
1ca70 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a  hread-specific.*
1ca80 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  * data for this 
1ca90 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20  thread has been 
1caa0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  deallocated..**.
1cab0 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e  ** SQLite no lon
1cac0 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d  ger uses thread-
1cad0 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f  specific data so
1cae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1caf0 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e   now a.** no-op.
1cb00 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64    It is retained
1cb10 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
1cb20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a  compatibility..*
1cb30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74  /.void sqlite3_t
1cb40 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f  hread_cleanup(vo
1cb50 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  id){.}.#endif../
1cb60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61  *.** Return meta
1cb70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1cb80 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f  ut a specific co
1cb90 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61  lumn of a databa
1cba0 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65  se table..** See
1cbb0 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69   comment in sqli
1cbc0 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e  te3.h (sqlite.h.
1cbd0 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  in) for details.
1cbe0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1cbf0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
1cc00 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
1cc10 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
1cc20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1cc30 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
1cc40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1cc50 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
1cc60 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
1cc70 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
1cc80 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
1cc90 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
1cca0 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
1ccb0 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
1ccc0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
1ccd0 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
1cce0 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
1ccf0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
1cd00 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
1cd10 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
1cd20 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
1cd30 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
1cd40 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1cd50 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
1cd60 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
1cd70 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
1cd80 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
1cd90 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
1cda0 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
1cdb0 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
1cdc0 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
1cdd0 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
1cde0 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
1cdf0 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1ce10 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
1ce20 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
1ce30 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
1ce40 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
1ce50 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
1ce60 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
1ce70 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
1ce80 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
1ce90 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
1cea0 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
1ceb0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1cec0 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
1ced0 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
1cee0 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
1cef0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
1cf00 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65  inc = 0;...#ifde
1cf10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1cf20 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1cf30 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1cf40 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61  eckOk(db) || zTa
1cf50 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  bleName==0 ){.  
1cf60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cf70 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
1cf80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
1cf90 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
1cfa0 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
1cfb0 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
1cfc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1cfd0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1cfe0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1cff0 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d  rAll(db);.  rc =
1d000 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
1d010 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
1d020 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1d030 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
1d040 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
1d050 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
1d060 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
1d070 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1d080 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
1d090 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
1d0a0 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
1d0b0 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
1d0c0 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
1d0d0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
1d0e0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
1d0f0 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
1d100 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
1d110 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
1d120 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d    if( zColumnNam
1d130 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51  e==0 ){.    /* Q
1d140 75 65 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e  uery for existan
1d150 63 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79  ce of table only
1d160 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1d170 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
1d180 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
1d190 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
1d1a0 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
1d1b0 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
1d1c0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
1d1d0 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
1d1e0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
1d1f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d210 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
1d220 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  >nCol ){.      i
1d230 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1d240 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  ) && sqlite3IsRo
1d250 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  wid(zColumnName)
1d260 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
1d270 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
1d280 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69          pCol = i
1d290 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e  Col>=0 ? &pTab->
1d2a0 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a  aCol[iCol] : 0;.
1d2b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d2c0 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20       pTab = 0;. 
1d2d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f         goto erro
1d2e0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
1d2f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
1d300 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
1d310 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
1d320 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
1d330 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
1d340 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
1d350 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
1d360 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
1d370 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
1d380 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
1d390 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
1d3a0 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
1d3b0 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
1d3c0 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
1d3d0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
1d3e0 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
1d3f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
1d400 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
1d410 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
1d420 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
1d430 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
1d440 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
1d450 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
1d460 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
1d470 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
1d480 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
1d490 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
1d4a0 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
1d4b0 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
1d4c0 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
1d4d0 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
1d4e0 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
1d4f0 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
1d500 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
1d510 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  e = sqlite3Colum
1d520 6e 54 79 70 65 28 70 43 6f 6c 2c 30 29 3b 0a 20  nType(pCol,0);. 
1d530 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43     zCollSeq = pC
1d540 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e  ol->zColl;.    n
1d550 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e  otnull = pCol->n
1d560 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70  otNull!=0;.    p
1d570 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43  rimarykey  = (pC
1d580 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43  ol->colFlags & C
1d590 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
1d5a0 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20  =0;.    autoinc 
1d5b0 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69  = pTab->iPKey==i
1d5c0 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61  Col && (pTab->ta
1d5d0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
1d5e0 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20  increment)!=0;. 
1d5f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74   }else{.    zDat
1d600 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  aType = "INTEGER
1d610 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  ";.    primaryke
1d620 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 1;.  }.  if(
1d630 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20   !zCollSeq ){.  
1d640 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c    zCollSeq = sql
1d650 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1d660 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20   }..error_out:. 
1d670 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1d680 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a  veAll(db);..  /*
1d690 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e   Whether the fun
1d6a0 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65  ction call succe
1d6b0 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20  eded or failed, 
1d6c0 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
1d6d0 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74  arameters.  ** t
1d6e0 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72  o whatever their
1d6f0 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61   local counterpa
1d700 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20  rts contain. If 
1d710 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63  an error did occ
1d720 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61  ur,.  ** this ha
1d730 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
1d740 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70  zeroing all outp
1d750 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ut parameters.. 
1d760 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61   */.  if( pzData
1d770 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79  Type ) *pzDataTy
1d780 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a  pe = zDataType;.
1d790 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20    if( pzCollSeq 
1d7a0 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a  ) *pzCollSeq = z
1d7b0 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70  CollSeq;.  if( p
1d7c0 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e  NotNull ) *pNotN
1d7d0 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20  ull = notnull;. 
1d7e0 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79   if( pPrimaryKey
1d7f0 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20   ) *pPrimaryKey 
1d800 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  = primarykey;.  
1d810 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a  if( pAutoinc ) *
1d820 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69  pAutoinc = autoi
1d830 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  nc;..  if( SQLIT
1d840 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61  E_OK==rc && !pTa
1d850 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
1d860 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
1d870 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67  sg);.    zErrMsg
1d880 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1d890 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74  f(db, "no such t
1d8a0 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e  able column: %s.
1d8b0 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  %s", zTableName,
1d8c0 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e  .        zColumn
1d8d0 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
1d8e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1d8f0 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
1d900 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20  WithMsg(db, rc, 
1d910 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29  (zErrMsg?"%s":0)
1d920 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
1d930 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d940 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d  zErrMsg);.  rc =
1d950 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
1d960 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
1d970 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1d980 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
1d990 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d9a0 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
1d9b0 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
1d9c0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
1d9d0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
1d9e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  int sqlite3_slee
1d9f0 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c  p(int ms){.  sql
1da00 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
1da10 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73    int rc;.  pVfs
1da20 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
1da30 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56  ind(0);.  if( pV
1da40 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  fs==0 ) return 0
1da50 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
1da60 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d  ction works in m
1da70 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74  illiseconds, but
1da80 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1da90 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20  OsSleep() .  ** 
1daa0 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65  API uses microse
1dab0 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65  conds. Hence the
1dac0 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20   1000's..  */.  
1dad0 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53  rc = (sqlite3OsS
1dae0 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a  leep(pVfs, 1000*
1daf0 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74  ms)/1000);.  ret
1db00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1db10 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
1db20 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20  le the extended 
1db30 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f  result codes..*/
1db40 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
1db50 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
1db60 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
1db70 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64  int onoff){.#ifd
1db80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1db90 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1dba0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1dbb0 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
1dbc0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1dbd0 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1dbe0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1dbf0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1dc00 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
1dc10 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
1dc20 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71  fff : 0xff;.  sq
1dc30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1dc40 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1dc50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dc60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
1dc70 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72  e the xFileContr
1dc80 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70  ol method on a p
1dc90 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
1dca0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
1dcb0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1dcc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1dcd0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1dce0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1dcf0 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  pArg){.  int rc 
1dd00 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1dd10 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b    Btree *pBtree;
1dd20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1dd30 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1dd40 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1dd50 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1dd60 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1dd70 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1dd80 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1dd90 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1dda0 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20  utex);.  pBtree 
1ddb0 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1ddc0 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1ddd0 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  me);.  if( pBtre
1dde0 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  e ){.    Pager *
1ddf0 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  pPager;.    sqli
1de00 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20  te3_file *fd;.  
1de10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1de20 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
1de30 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
1de40 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72  3BtreePager(pBtr
1de50 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ee);.    assert(
1de60 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
1de70 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61    fd = sqlite3Pa
1de80 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b  gerFile(pPager);
1de90 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21  .    assert( fd!
1dea0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70  =0 );.    if( op
1deb0 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46  ==SQLITE_FCNTL_F
1dec0 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20  ILE_POINTER ){. 
1ded0 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66       *(sqlite3_f
1dee0 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b  ile**)pArg = fd;
1def0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1df00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1df10 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1df20 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45  FCNTL_VFS_POINTE
1df30 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1df40 69 74 65 33 5f 76 66 73 2a 2a 29 70 41 72 67 20  ite3_vfs**)pArg 
1df50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  = sqlite3PagerVf
1df60 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  s(pPager);.     
1df70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1df80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1df90 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
1dfa0 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20  JOURNAL_POINTER 
1dfb0 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1dfc0 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
1dfd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 72 6e   sqlite3PagerJrn
1dfe0 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  lFile(pPager);. 
1dff0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e000 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1e010 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1e020 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e  NTL_DATA_VERSION
1e030 20 29 7b 0a 20 20 20 20 20 20 2a 28 75 6e 73 69   ){.      *(unsi
1e040 67 6e 65 64 20 69 6e 74 2a 29 70 41 72 67 20 3d  gned int*)pArg =
1e050 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 61 74   sqlite3PagerDat
1e060 61 56 65 72 73 69 6f 6e 28 70 50 61 67 65 72 29  aVersion(pPager)
1e070 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1e080 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1e090 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1e0a0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
1e0b0 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29  ol(fd, op, pArg)
1e0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1e0d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1e0e0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tree);.  }.  sql
1e0f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1e100 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1e110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e120 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
1e130 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
1e140 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
1e150 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
1e160 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
1e170 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65  nt rc = 0;.#ifde
1e180 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41  f SQLITE_UNTESTA
1e190 42 4c 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BLE.  UNUSED_PAR
1e1a0 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65 6c 73  AMETER(op);.#els
1e1b0 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  e.  va_list ap;.
1e1c0 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
1e1d0 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
1e1e0 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   ){..    /*.    
1e1f0 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
1e200 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1e210 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20   PRNG..    */.  
1e220 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e230 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
1e240 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1e250 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29  3PrngSaveState()
1e260 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e270 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1e280 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   ** Restore the 
1e290 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1e2a0 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74  G to the last st
1e2b0 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a  ate saved using.
1e2c0 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45      ** PRNG_SAVE
1e2d0 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20  .  If PRNG_SAVE 
1e2e0 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
1e2f0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
1e300 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76  en.    ** this v
1e310 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52  erb acts like PR
1e320 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f  NG_RESET..    */
1e330 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e340 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
1e350 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20  ESTORE: {.      
1e360 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f  sqlite3PrngResto
1e370 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  reState();.     
1e380 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1e390 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
1e3a0 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b  et the PRNG back
1e3b0 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61   to its uninitia
1e3c0 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68  lized state.  Th
1e3d0 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20  e next call.    
1e3e0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61  ** to sqlite3_ra
1e3f0 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20  ndomness() will 
1e400 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20  reseed the PRNG 
1e410 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63  using a single c
1e420 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  all.    ** to th
1e430 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65  e xRandomness me
1e440 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61  thod of the defa
1e450 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a  ult VFS..    */.
1e460 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e470 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
1e480 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  SET: {.      sql
1e490 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1e4a0 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  0,0);.      brea
1e4b0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1e4c0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1e4d0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49  _test_control(BI
1e4e0 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c  TVEC_TEST, size,
1e4f0 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a   program).    **
1e500 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65  .    ** Run a te
1e510 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74  st against a Bit
1e520 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69  vec object of si
1e530 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d  ze.  The program
1e540 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
1e550 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
1e560 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
1e570 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20  fines the test. 
1e580 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a   Return -1 on a.
1e590 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
1e5a0 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20  location error, 
1e5b0 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72  0 on success, or
1e5c0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e   non-zero for an
1e5d0 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53   error..    ** S
1e5e0 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69  ee the sqlite3Bi
1e5f0 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
1e600 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
1e610 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
1e620 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1e630 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
1e640 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20  TVEC_TEST: {.   
1e650 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
1e660 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1e670 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20     int *aProg = 
1e680 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
1e690 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1e6a0 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
1e6b0 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29  nTest(sz, aProg)
1e6c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e6d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1e6e0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1e6f0 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f  t_control(FAULT_
1e700 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61  INSTALL, xCallba
1e710 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck).    **.    *
1e720 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69 6e 76  * Arrange to inv
1e730 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28 29 20  oke xCallback() 
1e740 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33  whenever sqlite3
1e750 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20 63 61  FaultSim() is ca
1e760 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20  lled,.    ** if 
1e770 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74  xCallback is not
1e780 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20   NULL..    **.  
1e790 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74 20 6f    ** As a test o
1e7a0 66 20 74 68 65 20 66 61 75 6c 74 20 73 69 6d 75  f the fault simu
1e7b0 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20  lator mechanism 
1e7c0 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65 33 46  itself, sqlite3F
1e7d0 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20 20 2a  aultSim(0).    *
1e7e0 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65  * is called imme
1e7f0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 69 6e  diately after in
1e800 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77  stalling the new
1e810 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   callback and th
1e820 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  e return.    ** 
1e830 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69 74  value from sqlit
1e840 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20 62 65  e3FaultSim(0) be
1e850 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75 72 6e  comes the return
1e860 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
1e870 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e880 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  l()..    */.    
1e890 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e8a0 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41  CTRL_FAULT_INSTA
1e8b0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d  LL: {.      /* M
1e8c0 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f  SVC is picky abo
1e8d0 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20  ut pulling func 
1e8e0 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73  ptrs from va lis
1e8f0 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74  ts..      ** htt
1e900 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72  p://support.micr
1e910 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39  osoft.com/kb/479
1e920 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  61.      ** sqli
1e930 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e940 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20  xTestCallback = 
1e950 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 28 2a  va_arg(ap, int(*
1e960 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a  )(int));.      *
1e970 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
1e980 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42 41 43  int(*TESTCALLBAC
1e990 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20  KFUNC_t)(int);. 
1e9a0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1e9b0 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61  alConfig.xTestCa
1e9c0 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28  llback = va_arg(
1e9d0 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41 43 4b  ap, TESTCALLBACK
1e9e0 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 72  FUNC_t);.      r
1e9f0 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  c = sqlite3Fault
1ea00 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20 62 72  Sim(0);.      br
1ea10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ea20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1ea30 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ea40 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
1ea50 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e  OKS, xBegin, xEn
1ea60 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
1ea70 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20   Register hooks 
1ea80 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63  to call to indic
1ea90 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63  ate which malloc
1eaa0 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20  () failures .   
1eab0 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a   ** are benign..
1eac0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ead0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1eae0 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
1eaf0 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70  OKS: {.      typ
1eb00 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64  edef void (*void
1eb10 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29  _function)(void)
1eb20 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
1eb30 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67  ction xBenignBeg
1eb40 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  in;.      void_f
1eb50 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45  unction xBenignE
1eb60 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  nd;.      xBenig
1eb70 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28  nBegin = va_arg(
1eb80 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
1eb90 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  n);.      xBenig
1eba0 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70  nEnd = va_arg(ap
1ebb0 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
1ebc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1ebd0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73  enignMallocHooks
1ebe0 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78  (xBenignBegin, x
1ebf0 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20  BenignEnd);.    
1ec00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1ec10 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1ec20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1ec30 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1ec40 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
1ec50 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58  , unsigned int X
1ec60 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1ec70 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20  Set the PENDING 
1ec80 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75  byte to the valu
1ec90 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  e in the argumen
1eca0 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a  t, if X>0..    *
1ecb0 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
1ecc0 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75  s if X==0.  Retu
1ecd0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
1ece0 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65  the pending byte
1ecf0 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78  .    ** as it ex
1ed00 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68  isting before th
1ed10 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1ed20 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  alled..    **.  
1ed30 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20    ** IMPORTANT: 
1ed40 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
1ed50 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20  NDING byte from 
1ed60 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c  0x40000000 resul
1ed70 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20  ts in.    ** an 
1ed80 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74  incompatible dat
1ed90 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61  abase file forma
1eda0 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  t.  Changing the
1edb0 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20   PENDING byte.  
1edc0 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64    ** while any d
1edd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1ede0 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c  on is open resul
1edf0 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20  ts in undefined 
1ee00 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
1ee10 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e  erious behavior.
1ee20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ee30 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ee40 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b  _PENDING_BYTE: {
1ee50 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44  .      rc = PEND
1ee60 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65  ING_BYTE;.#ifnde
1ee70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
1ee80 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  D.      {.      
1ee90 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e    unsigned int n
1eea0 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61  ewVal = va_arg(a
1eeb0 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  p, unsigned int)
1eec0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
1eed0 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65  wVal ) sqlite3Pe
1eee0 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56  ndingByte = newV
1eef0 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  al;.      }.#end
1ef00 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
1ef10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1ef20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1ef30 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ef40 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1ef50 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  T, int X).    **
1ef60 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74  .    ** This act
1ef70 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72  ion provides a r
1ef80 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20  un-time test to 
1ef90 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
1efa0 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  ot.    ** assert
1efb0 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  () was enabled a
1efc0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
1efd0 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
1efe0 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a  d assert().    *
1eff0 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  * is enabled, th
1f000 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
1f010 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49 66  lue is true.  If
1f020 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20   X is true and. 
1f030 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69     ** assert() i
1f040 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
1f050 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1f060 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58  e is zero.  If X
1f070 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65   is.    ** false
1f080 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
1f090 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
1f0a0 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72  he assertion fir
1f0b0 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  es and the.    *
1f0c0 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73  * process aborts
1f0d0 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73 65  .  If X is false
1f0e0 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
1f0f0 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
1f100 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  the.    ** retur
1f110 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
1f120 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1f130 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1f140 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20  _ASSERT: {.     
1f150 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20   volatile int x 
1f160 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
1f170 74 28 20 2f 2a 73 69 64 65 2d 65 66 66 65 63 74  t( /*side-effect
1f180 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20 76 61 5f 61  s-ok*/ (x = va_a
1f190 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
1f1a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
1f1b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f1c0 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
1f1d0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1f1e0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1f1f0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
1f200 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
1f210 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
1f220 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
1f230 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
1f240 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
1f250 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
1f260 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
1f270 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
1f280 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
1f290 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
1f2a0 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
1f2b0 58 29 20 69 66 20 58 20 69 73 20 74 72 75 65 2c  X) if X is true,
1f2c0 20 6f 72 20 30 20 69 66 20 58 20 69 73 20 66 61   or 0 if X is fa
1f2d0 6c 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lse..    **.    
1f2e0 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64  ** The recommend
1f2f0 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e  ed test is X==2.
1f300 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1f310 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74  value is 2, that
1f320 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c   means.    ** AL
1f330 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
1f340 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f  () are both no-o
1f350 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
1f360 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  acros, which is 
1f370 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
1f380 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20  lt setting.  If 
1f390 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1f3a0 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41   is 1, then ALWA
1f3b0 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20  YS() is either. 
1f3c0 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64     ** hard-coded
1f3d0 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65   to true or else
1f3e0 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69   it asserts if i
1f3f0 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ts argument is f
1f400 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  alse..    ** The
1f410 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20   first behavior 
1f420 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74  (hard-coded to t
1f430 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65  rue) is the case
1f440 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1f450 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1f460 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1f470 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1f480 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  d and the second
1f490 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  .    ** behavior
1f4a0 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20   (assert if the 
1f4b0 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41  argument to ALWA
1f4c0 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69  YS() is false) i
1f4d0 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
1f4e0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
1f4f0 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
1f500 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
1f510 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
1f520 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
1f530 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63  n-time test proc
1f540 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b  edure might look
1f550 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
1f560 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
1f570 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74   **    if( sqlit
1f580 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1f590 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f5a0 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b  ALWAYS, 2)==2 ){
1f5b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1f5c0 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
1f5d0 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70  ER() are no-op p
1f5e0 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
1f5f0 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  os.    **    }el
1f600 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  se if( sqlite3_t
1f610 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1f620 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1f630 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a  RT, 1) ){.    **
1f640 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1f650 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20  x) asserts that 
1f660 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52  x is true. NEVER
1f670 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73  (x) asserts x is
1f680 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20   false..    **  
1f690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
1f6a0 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
1f6b0 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1f6c0 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20  1.  NEVER(x) is 
1f6d0 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20  a constant 0..  
1f6e0 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f    **    }.    */
1f6f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f700 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1f710 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  : {.      int x 
1f720 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1f730 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 20 3f  ;.      rc = x ?
1f740 20 41 4c 57 41 59 53 28 78 29 20 3a 20 30 3b 0a   ALWAYS(x) : 0;.
1f750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f760 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1f770 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1f780 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1f790 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44  TESTCTRL_BYTEORD
1f7a0 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ER);.    **.    
1f7b0 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 72  ** The integer r
1f7c0 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c 73 20  eturned reveals 
1f7d0 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f  the byte-order o
1f7e0 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20 6f  f the computer o
1f7f0 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 53  n which.    ** S
1f800 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69 6e 67  QLite is running
1f810 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1f820 20 20 20 20 20 20 31 20 20 20 20 20 62 69 67 2d        1     big-
1f830 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72  endian,    deter
1f840 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  mined at run-tim
1f850 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 31 30  e.    **      10
1f860 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69       little-endi
1f870 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61  an, determined a
1f880 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
1f890 2a 20 20 34 33 32 31 30 31 20 20 20 20 20 62 69  *  432101     bi
1f8a0 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74  g-endian,    det
1f8b0 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  ermined at compi
1f8c0 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  le-time.    **  
1f8d0 31 32 33 34 31 30 20 20 20 20 20 6c 69 74 74 6c  123410     littl
1f8e0 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
1f8f0 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1f900 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20  time.    */ .   
1f910 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1f920 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a  TCTRL_BYTEORDER:
1f930 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
1f940 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 2a 31  LITE_BYTEORDER*1
1f950 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54  00 + SQLITE_LITT
1f960 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51  LEENDIAN*10 + SQ
1f970 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a  LITE_BIGENDIAN;.
1f980 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f990 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1f9a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f9b0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f9c0 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74  L_RESERVE, sqlit
1f9d0 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
1f9e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1f9f0 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 69   the nReserve si
1fa00 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20  ze to N for the 
1fa10 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
1fa20 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1fa30 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
1fa40 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  db..    */.    c
1fa50 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1fa60 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20  TRL_RESERVE: {. 
1fa70 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1fa80 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
1fa90 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69  lite3*);.      i
1faa0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1fab0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,int);.      sql
1fac0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1fad0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1fae0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
1faf0 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61  etPageSize(db->a
1fb00 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c  Db[0].pBt, 0, x,
1fb10 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1fb20 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1fb30 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1fb40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1fb50 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
1fb60 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1fb70 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
1fb80 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74  MIZATIONS, sqlit
1fb90 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
1fba0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61     **.    ** Ena
1fbb0 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76  ble or disable v
1fbc0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1fbd0 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67  ions for testing
1fbe0 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20   purposes.  The 
1fbf0 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  .    ** argument
1fc00 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20   N is a bitmask 
1fc10 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  of optimizations
1fc20 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e   to be disabled.
1fc30 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20    For normal.   
1fc40 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20   ** operation N 
1fc50 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68  should be 0.  Th
1fc60 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 61  e idea is that a
1fc70 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c   test program (l
1fc80 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  ike the.    ** S
1fc90 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72  QL Logic Test or
1fca0 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65   SLT test module
1fcb0 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61  ) can run the sa
1fcc0 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20  me SQL multiple 
1fcd0 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74  times.    ** wit
1fce0 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  h various optimi
1fcf0 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64  zations disabled
1fd00 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
1fd10 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
1fd20 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e      ** is obtain
1fd30 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73 65  ed in every case
1fd40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1fd50 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1fd60 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a  L_OPTIMIZATIONS:
1fd70 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1fd80 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1fd90 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1fda0 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67     db->dbOptFlag
1fdb0 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72 67  s = (u16)(va_arg
1fdc0 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66 66  (ap, int) & 0xff
1fdd0 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ff);.      break
1fde0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1fdf0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1fe00 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1fe10 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
1fe20 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66  _FAULT, int onof
1fe30 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  f);.    **.    *
1fe40 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f  * If parameter o
1fe50 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  noff is non-zero
1fe60 2c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  , subsequent cal
1fe70 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28  ls to localtime(
1fe80 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 74 73  ).    ** and its
1fe90 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20   variants fail. 
1fea0 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f  If onoff is zero
1feb0 2c 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74  , undo this sett
1fec0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1fed0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1fee0 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1fef0 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  AULT: {.      sq
1ff00 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ff10 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c  g.bLocaltimeFaul
1ff20 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
1ff30 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
1ff40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ff50 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ff60 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ff70 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f  STCTRL_INTERNAL_
1ff80 46 55 4e 43 53 2c 20 69 6e 74 20 6f 6e 6f 66 66  FUNCS, int onoff
1ff90 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1ffa0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e   If parameter on
1ffb0 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  off is non-zero,
1ffc0 20 69 6e 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e   internal-use-on
1ffd0 6c 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ly SQL functions
1ffe0 0a 20 20 20 20 2a 2a 20 61 72 65 20 76 69 73 69  .    ** are visi
1fff0 62 6c 65 20 74 6f 20 6f 72 64 69 6e 61 72 79 20  ble to ordinary 
20000 53 51 4c 2e 20 20 54 68 69 73 20 69 73 20 75 73  SQL.  This is us
20010 65 66 75 6c 20 66 6f 72 20 74 65 73 74 69 6e 67  eful for testing
20020 20 62 75 74 20 69 73 0a 20 20 20 20 2a 2a 20 75   but is.    ** u
20030 6e 73 61 66 65 20 62 65 63 61 75 73 65 20 69 6e  nsafe because in
20040 76 61 6c 69 64 20 70 61 72 61 6d 65 74 65 72 73  valid parameters
20050 20 74 6f 20 74 68 6f 73 65 20 69 6e 74 65 72 6e   to those intern
20060 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 66 75 6e 63  al-use-only func
20070 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 63 61 6e  tions.    ** can
20080 20 72 65 73 75 6c 74 20 69 6e 20 63 72 61 73 68   result in crash
20090 65 73 20 6f 72 20 73 65 67 66 61 75 6c 74 73 2e  es or segfaults.
200a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
200b0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
200c0 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49  _INTERNAL_FUNCTI
200d0 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ONS: {.      sql
200e0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
200f0 2e 62 49 6e 74 65 72 6e 61 6c 46 75 6e 63 74 69  .bInternalFuncti
20100 6f 6e 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ons = va_arg(ap,
20110 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
20120 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20130 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
20140 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
20150 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
20160 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20  ORRUPT, int);.  
20170 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
20180 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20  or clear a flag 
20190 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74  that indicates t
201a0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
201b0 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20   file is always 
201c0 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72  well-.    ** for
201d0 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f  med and never co
201e0 72 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61  rrupt.  This fla
201f0 67 20 69 73 20 63 6c 65 61 72 20 62 79 20 64 65  g is clear by de
20200 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e  fault, indicatin
20210 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61  g that.    ** da
20220 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67  tabase files mig
20230 68 74 20 68 61 76 65 20 61 72 62 69 74 72 61 72  ht have arbitrar
20240 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53  y corruption.  S
20250 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20  etting the flag 
20260 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65  during.    ** te
20270 73 74 69 6e 67 20 63 61 75 73 65 73 20 63 65 72  sting causes cer
20280 74 61 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  tain assert() st
20290 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
202a0 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69 76  code to be activ
202b0 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74  ated.    ** that
202c0 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61   demonstrat inva
202d0 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66  riants on well-f
202e0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
202f0 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iles..    */.   
20300 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
20310 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
20320 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  UPT: {.      sql
20330 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
20340 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20  .neverCorrupt = 
20350 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
20360 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20370 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
20380 74 68 65 20 74 68 72 65 73 68 6f 6c 64 20 61 74  the threshold at
20390 20 77 68 69 63 68 20 4f 50 5f 4f 6e 63 65 20 63   which OP_Once c
203a0 6f 75 6e 74 65 72 73 20 72 65 73 65 74 20 62 61  ounters reset ba
203b0 63 6b 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20  ck to zero..    
203c0 2a 2a 20 42 79 20 64 65 66 61 75 6c 74 20 74 68  ** By default th
203d0 69 73 20 69 73 20 30 78 37 66 66 66 66 66 66 65  is is 0x7ffffffe
203e0 20 28 6f 76 65 72 20 32 20 62 69 6c 6c 69 6f 6e   (over 2 billion
203f0 29 2c 20 62 75 74 20 74 68 61 74 20 76 61 6c 75  ), but that valu
20400 65 20 69 73 0a 20 20 20 20 2a 2a 20 74 6f 6f 20  e is.    ** too 
20410 62 69 67 20 74 6f 20 74 65 73 74 20 69 6e 20 61  big to test in a
20420 20 72 65 61 73 6f 6e 61 62 6c 65 20 61 6d 6f 75   reasonable amou
20430 6e 74 20 6f 66 20 74 69 6d 65 2c 20 73 6f 20 74  nt of time, so t
20440 68 69 73 20 63 6f 6e 74 72 6f 6c 20 69 73 0a 20  his control is. 
20450 20 20 20 2a 2a 20 70 72 6f 76 69 64 65 64 20 74     ** provided t
20460 6f 20 73 65 74 20 61 20 73 6d 61 6c 6c 20 61 6e  o set a small an
20470 64 20 65 61 73 69 6c 79 20 72 65 61 63 68 61 62  d easily reachab
20480 6c 65 20 72 65 73 65 74 20 76 61 6c 75 65 2e 0a  le reset value..
20490 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
204a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
204b0 4f 4e 43 45 5f 52 45 53 45 54 5f 54 48 52 45 53  ONCE_RESET_THRES
204c0 48 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  HOLD: {.      sq
204d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
204e0 67 2e 69 4f 6e 63 65 52 65 73 65 74 54 68 72 65  g.iOnceResetThre
204f0 73 68 6f 6c 64 20 3d 20 76 61 5f 61 72 67 28 61  shold = va_arg(a
20500 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
20510 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
20520 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
20530 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
20540 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f  E_TESTCTRL_VDBE_
20550 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62  COVERAGE, xCallb
20560 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a  ack, ptr);.    *
20570 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
20580 20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63   VDBE coverage c
20590 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
205a0 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69   to xCallback wi
205b0 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20  th context .    
205c0 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a  ** pointer ptr..
205d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
205e0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
205f0 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b  VDBE_COVERAGE: {
20600 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
20610 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20  DBE_COVERAGE.   
20620 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
20630 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63  (*branch_callbac
20640 6b 29 28 76 6f 69 64 2a 2c 75 6e 73 69 67 6e 65  k)(void*,unsigne
20650 64 20 69 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  d int,.         
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
20680 69 67 6e 65 64 20 63 68 61 72 2c 75 6e 73 69 67  igned char,unsig
20690 6e 65 64 20 63 68 61 72 29 3b 0a 20 20 20 20 20  ned char);.     
206a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
206b0 6e 66 69 67 2e 78 56 64 62 65 42 72 61 6e 63 68  nfig.xVdbeBranch
206c0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 62 72 61   = va_arg(ap,bra
206d0 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  nch_callback);. 
206e0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
206f0 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65 42 72  alConfig.pVdbeBr
20700 61 6e 63 68 41 72 67 20 3d 20 76 61 5f 61 72 67  anchArg = va_arg
20710 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  (ap,void*);.#end
20720 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
20730 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
20740 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
20750 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
20760 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
20770 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a  , db, nMax); */.
20780 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20790 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
207a0 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 73 71  MMAP: {.      sq
207b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
207c0 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
207d0 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78  ;.      db->nMax
207e0 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f  SorterMmap = va_
207f0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
20800 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20810 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
20820 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
20830 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20840 49 53 49 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a  ISINIT);.    **.
20850 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 53 51      ** Return SQ
20860 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74  LITE_OK if SQLit
20870 65 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69  e has been initi
20880 61 6c 69 7a 65 64 20 61 6e 64 20 53 51 4c 49 54  alized and SQLIT
20890 45 5f 45 52 52 4f 52 20 69 66 0a 20 20 20 20 2a  E_ERROR if.    *
208a0 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  * not..    */.  
208b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
208c0 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b  STCTRL_ISINIT: {
208d0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
208e0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
208f0 73 49 6e 69 74 3d 3d 30 20 29 20 72 63 20 3d 20  sInit==0 ) rc = 
20900 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
20910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20920 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
20930 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
20940 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
20950 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 64 62 4e  MPOSTER, db, dbN
20960 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d  ame, onOff, tnum
20970 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
20980 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e 74 72   This test contr
20990 6f 6c 20 69 73 20 75 73 65 64 20 74 6f 20 63 72  ol is used to cr
209a0 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61  eate imposter ta
209b0 62 6c 65 73 2e 20 20 22 64 62 22 20 69 73 20 61  bles.  "db" is a
209c0 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20   pointer.    ** 
209d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
209e0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 64 62 4e  connection.  dbN
209f0 61 6d 65 20 69 73 20 74 68 65 20 64 61 74 61 62  ame is the datab
20a00 61 73 65 20 6e 61 6d 65 20 28 65 78 3a 20 22 6d  ase name (ex: "m
20a10 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a 2a 20 22  ain" or.    ** "
20a20 74 65 6d 70 22 29 20 77 68 69 63 68 20 77 69 6c  temp") which wil
20a30 6c 20 72 65 63 65 69 76 65 20 74 68 65 20 69 6d  l receive the im
20a40 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f 66 66 22  poster.  "onOff"
20a50 20 74 75 72 6e 73 20 69 6d 70 6f 73 74 65 72 20   turns imposter 
20a60 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f  mode on.    ** o
20a70 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d 22 20 69  r off.  "tnum" i
20a80 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
20a90 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 74 6f  of the b-tree to
20aa0 20 77 68 69 63 68 20 74 68 65 20 69 6d 70 6f 73   which the impos
20ab0 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ter.    ** table
20ac0 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65 63 74 2e   should connect.
20ad0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
20ae0 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65 72 20 6d  nable imposter m
20af0 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  ode only when th
20b00 65 20 73 63 68 65 6d 61 20 68 61 73 20 61 6c 72  e schema has alr
20b10 65 61 64 79 20 62 65 65 6e 20 70 61 72 73 65 64  eady been parsed
20b20 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20 72  .  Then.    ** r
20b30 75 6e 20 61 20 73 69 6e 67 6c 65 20 43 52 45 41  un a single CREA
20b40 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
20b50 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  nt to construct 
20b60 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  the imposter tab
20b70 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  le in.    ** the
20b80 20 70 61 72 73 65 64 20 73 63 68 65 6d 61 2e 20   parsed schema. 
20b90 20 54 68 65 6e 20 74 75 72 6e 20 69 6d 70 6f 73   Then turn impos
20ba0 74 65 72 20 6d 6f 64 65 20 62 61 63 6b 20 6f 66  ter mode back of
20bb0 66 20 61 67 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a  f again..    **.
20bc0 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d      ** If onOff=
20bd0 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30 20 74 68  =0 and tnum>0 th
20be0 65 6e 20 72 65 73 65 74 20 74 68 65 20 73 63 68  en reset the sch
20bf0 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ema for all data
20c00 62 61 73 65 73 2c 20 63 61 75 73 69 6e 67 0a 20  bases, causing. 
20c10 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61     ** the schema
20c20 20 74 6f 20 62 65 20 72 65 70 61 72 73 65 64 20   to be reparsed 
20c30 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
20c40 20 69 73 20 6e 65 65 64 65 64 2e 20 20 54 68 69   is needed.  Thi
20c50 73 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  s has the.    **
20c60 20 65 66 66 65 63 74 20 6f 66 20 65 72 61 73 69   effect of erasi
20c70 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74 65 72 20  ng all imposter 
20c80 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  tables..    */. 
20c90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
20ca0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
20cb0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
20cc0 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
20cd0 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
20ce0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20cf0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
20d00 78 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  x);.      db->in
20d10 69 74 2e 69 44 62 20 3d 20 73 71 6c 69 74 65 33  it.iDb = sqlite3
20d20 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 76  FindDbName(db, v
20d30 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73 74 20 63  a_arg(ap,const c
20d40 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 64 62  har*));.      db
20d50 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 64 62  ->init.busy = db
20d60 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54  ->init.imposterT
20d70 61 62 6c 65 20 3d 20 76 61 5f 61 72 67 28 61 70  able = va_arg(ap
20d80 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64 62 2d  ,int);.      db-
20d90 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20  >init.newTnum = 
20da0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
20db0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e        if( db->in
20dc0 69 74 2e 62 75 73 79 3d 3d 30 20 26 26 20 64 62  it.busy==0 && db
20dd0 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e 30  ->init.newTnum>0
20de0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20df0 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
20e00 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
20e10 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
20e20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20e30 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
20e40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20e50 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65     }..#if define
20e60 64 28 59 59 43 4f 56 45 52 41 47 45 29 0a 20 20  d(YYCOVERAGE).  
20e70 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    /*  sqlite3_te
20e80 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
20e90 45 5f 54 45 53 54 43 54 52 4c 5f 50 41 52 53 45  E_TESTCTRL_PARSE
20ea0 52 5f 43 4f 56 45 52 41 47 45 2c 20 46 49 4c 45  R_COVERAGE, FILE
20eb0 20 2a 6f 75 74 29 0a 20 20 20 20 2a 2a 0a 20 20   *out).    **.  
20ec0 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63    ** This test c
20ed0 6f 6e 74 72 6f 6c 20 28 6f 6e 6c 79 20 61 76 61  ontrol (only ava
20ee0 69 6c 61 62 6c 65 20 77 68 65 6e 20 53 51 4c 69  ilable when SQLi
20ef0 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
20f00 69 74 68 0a 20 20 20 20 2a 2a 20 2d 44 59 59 43  ith.    ** -DYYC
20f10 4f 56 45 52 41 47 45 29 20 77 72 69 74 65 73 20  OVERAGE) writes 
20f20 61 20 72 65 70 6f 72 74 20 6f 6e 74 6f 20 22 6f  a report onto "o
20f30 75 74 22 20 74 68 61 74 20 73 68 6f 77 73 20 61  ut" that shows a
20f40 6c 6c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 2f  ll.    ** state/
20f50 6c 6f 6f 6b 61 68 65 61 64 20 63 6f 6d 62 69 6e  lookahead combin
20f60 61 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 61  ations in the pa
20f70 72 73 65 72 20 73 74 61 74 65 20 6d 61 63 68 69  rser state machi
20f80 6e 65 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  ne.    ** which 
20f90 61 72 65 20 6e 65 76 65 72 20 65 78 65 72 63 69  are never exerci
20fa0 73 65 64 2e 20 20 49 66 20 61 6e 79 20 73 74 61  sed.  If any sta
20fb0 74 65 20 69 73 20 6d 69 73 73 65 64 2c 20 6d 61  te is missed, ma
20fc0 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  ke the.    ** re
20fd0 74 75 72 6e 20 63 6f 64 65 20 53 51 4c 49 54 45  turn code SQLITE
20fe0 5f 45 52 52 4f 52 2e 0a 20 20 20 20 2a 2f 0a 20  _ERROR..    */. 
20ff0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
21000 45 53 54 43 54 52 4c 5f 50 41 52 53 45 52 5f 43  ESTCTRL_PARSER_C
21010 4f 56 45 52 41 47 45 3a 20 7b 0a 20 20 20 20 20  OVERAGE: {.     
21020 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 76 61 5f   FILE *out = va_
21030 61 72 67 28 61 70 2c 20 46 49 4c 45 2a 29 3b 0a  arg(ap, FILE*);.
21040 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21050 33 50 61 72 73 65 72 43 6f 76 65 72 61 67 65 28  3ParserCoverage(
21060 6f 75 74 29 20 29 20 72 63 20 3d 20 53 51 4c 49  out) ) rc = SQLI
21070 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
21080 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
21090 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 59  dif /* defined(Y
210a0 59 43 4f 56 45 52 41 47 45 29 20 2a 2f 0a 20 20  YCOVERAGE) */.  
210b0 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
210c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
210d0 5f 55 4e 54 45 53 54 41 42 4c 45 20 2a 2f 0a 20  _UNTESTABLE */. 
210e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
210f0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
21100 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20  tility routine, 
21110 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d  useful to VFS im
21120 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74  plementations, t
21130 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f  hat checks.** to
21140 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61   see if a databa
21150 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52  se file was a UR
21160 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64  I that contained
21170 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72   a specific quer
21180 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c  y .** parameter,
21190 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69   and if so obtai
211a0 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
211b0 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  the query parame
211c0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  ter..**.** The z
211d0 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
211e0 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d  t is the filenam
211f0 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64  e pointer passed
21200 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28   into the xOpen(
21210 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61  ).** method of a
21220 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
21230 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d  ion.  The zParam
21240 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
21250 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
21260 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
21270 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72  we seek.  This r
21280 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
21290 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
212a0 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65  zParam.** parame
212b0 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73  ter if it exists
212c0 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  .  If the parame
212d0 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ter does not exi
212e0 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
212f0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55  .** returns a NU
21300 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63  LL pointer..*/.c
21310 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21320 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
21330 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
21340 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
21350 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69  ar *zParam){.  i
21360 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
21370 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72  || zParam==0 ) r
21380 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65  eturn 0;.  zFile
21390 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
213a0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
213b0 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  e) + 1;.  while(
213c0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
213d0 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72  .    int x = str
213e0 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  cmp(zFilename, z
213f0 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c  Param);.    zFil
21400 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
21410 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
21420 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  me) + 1;.    if(
21430 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a   x==0 ) return z
21440 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46  Filename;.    zF
21450 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
21460 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
21470 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20  name) + 1;.  }. 
21480 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21490 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f  .** Return a boo
214a0 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  lean value for a
214b0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
214c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
214d0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e  _uri_boolean(con
214e0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
214f0 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
21500 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c  zParam, int bDfl
21510 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
21520 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
21530 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
21540 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
21550 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21    bDflt = bDflt!
21560 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f  =0;.  return z ?
21570 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
21580 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62  an(z, bDflt) : b
21590 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
215a0 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69  eturn a 64-bit i
215b0 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
215c0 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74   a query paramet
215d0 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  er..*/.sqlite3_i
215e0 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69  nt64 sqlite3_uri
215f0 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20  _int64(.  const 
21600 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
21610 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
21620 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70  as passed to xOp
21630 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  en */.  const ch
21640 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20  ar *zParam,     
21650 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74    /* URI paramet
21660 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73  er sought */.  s
21670 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66  qlite3_int64 bDf
21680 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  lt       /* retu
21690 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20  rn if parameter 
216a0 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b  is missing */.){
216b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
216c0 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
216d0 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
216e0 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73  me, zParam);.  s
216f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a  qlite3_int64 v;.
21700 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74    if( z && sqlit
21710 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
21720 7a 2c 20 26 76 29 3d 3d 30 20 29 7b 0a 20 20 20  z, &v)==0 ){.   
21730 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a   bDflt = v;.  }.
21740 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a    return bDflt;.
21750 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21760 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65  the Btree pointe
21770 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  r identified by 
21780 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e  zDbName.  Return
21790 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
217a0 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71  nd..*/.Btree *sq
217b0 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
217c0 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
217d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
217e0 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 44 62 20  ame){.  int iDb 
217f0 3d 20 7a 44 62 4e 61 6d 65 20 3f 20 73 71 6c 69  = zDbName ? sqli
21800 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
21810 2c 20 7a 44 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  , zDbName) : 0;.
21820 20 20 72 65 74 75 72 6e 20 69 44 62 3c 30 20 3f    return iDb<0 ?
21830 20 30 20 3a 20 64 62 2d 3e 61 44 62 5b 69 44 62   0 : db->aDb[iDb
21840 5d 2e 70 42 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ].pBt;.}../*.** 
21850 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e  Return the filen
21860 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
21870 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
21880 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ith a database.*
21890 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
218a0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
218b0 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
218c0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
218d0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
218e0 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
218f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21900 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
21910 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
21920 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
21930 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
21940 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
21950 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
21960 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74    }.#endif.  pBt
21970 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
21980 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
21990 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
219a0 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
219b0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74  eGetFilename(pBt
219c0 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) : 0;.}../*.** 
219d0 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61  Return 1 if data
219e0 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
219f0 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77  y or 0 if read/w
21a00 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  rite.  Return -1
21a10 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64   if.** no such d
21a20 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a  atabase exists..
21a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
21a40 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  b_readonly(sqlit
21a50 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
21a60 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
21a70 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64  Btree *pBt;.#ifd
21a80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21a90 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
21aa0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
21ab0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
21ac0 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
21ad0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
21ae0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23  return -1;.  }.#
21af0 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71  endif.  pBt = sq
21b00 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
21b10 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
21b20 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20  .  return pBt ? 
21b30 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65  sqlite3BtreeIsRe
21b40 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20 2d 31  adonly(pBt) : -1
21b50 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
21b60 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
21b70 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  OT./*.** Obtain 
21b80 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c  a snapshot handl
21b90 65 20 66 6f 72 20 74 68 65 20 73 6e 61 70 73 68  e for the snapsh
21ba0 6f 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 7a  ot of database z
21bb0 44 62 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a  Db currently .**
21bc0 20 62 65 69 6e 67 20 72 65 61 64 20 62 79 20 68   being read by h
21bd0 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
21be0 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
21bf0 74 5f 67 65 74 28 0a 20 20 73 71 6c 69 74 65 33  t_get(.  sqlite3
21c00 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63   *db, .  const c
21c10 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71 6c 69  har *zDb,.  sqli
21c20 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 2a 70  te3_snapshot **p
21c30 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69  pSnapshot.){.  i
21c40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
21c50 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51  RROR;.#ifndef SQ
21c60 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23  LITE_OMIT_WAL..#
21c70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
21c80 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
21c90 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
21ca0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
21cb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21cc0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
21cd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
21ce0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
21cf0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  (db->mutex);..  
21d00 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
21d10 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  it==0 ){.    int
21d20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
21d30 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
21d40 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  );.    if( iDb==
21d50 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20  0 || iDb>1 ){.  
21d60 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
21d70 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
21d80 74 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  t;.      if( 0==
21d90 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
21da0 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
21db0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21dc0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
21dd0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
21de0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21e10 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 47 65  3PagerSnapshotGe
21e20 74 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t(sqlite3BtreePa
21e30 67 65 72 28 70 42 74 29 2c 20 70 70 53 6e 61 70  ger(pBt), ppSnap
21e40 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  shot);.        }
21e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21e60 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
21e70 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
21e80 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f  tex);.#endif   /
21e90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
21ea0 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  L */.  return rc
21eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
21ec0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
21ed0 6f 6e 20 6f 6e 20 74 68 65 20 73 6e 61 70 73 68  on on the snapsh
21ee0 6f 74 20 69 64 65 6e 64 69 66 69 65 64 20 62 79  ot idendified by
21ef0 20 70 53 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69   pSnapshot..*/.i
21f00 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  nt sqlite3_snaps
21f10 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69  hot_open(.  sqli
21f20 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73  te3 *db, .  cons
21f30 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20  t char *zDb, .  
21f40 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
21f50 20 2a 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20   *pSnapshot.){. 
21f60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21f70 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20  _ERROR;.#ifndef 
21f80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
21f90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21fa0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
21fb0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
21fc0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
21fd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
21fe0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
21ff0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
22000 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
22010 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
22020 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
22030 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  mit==0 ){.    in
22040 74 20 69 44 62 3b 0a 20 20 20 20 69 44 62 20 3d  t iDb;.    iDb =
22050 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
22060 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  me(db, zDb);.   
22070 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
22080 44 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74  Db>1 ){.      Bt
22090 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
220a0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
220b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
220c0 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
220d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
220e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
220f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
22100 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  r(pBt);.        
22110 69 6e 74 20 62 55 6e 6c 6f 63 6b 20 3d 20 30 3b  int bUnlock = 0;
22120 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
22130 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
22140 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  dTrans(pBt) ){. 
22150 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
22160 3e 6e 56 64 62 65 41 63 74 69 76 65 3d 3d 30 20  >nVdbeActive==0 
22170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
22180 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22190 53 6e 61 70 73 68 6f 74 43 68 65 63 6b 28 70 50  SnapshotCheck(pP
221a0 61 67 65 72 2c 20 70 53 6e 61 70 73 68 6f 74 29  ager, pSnapshot)
221b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
221c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
221d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
221e0 20 62 55 6e 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20   bUnlock = 1;.  
221f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22200 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
22210 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
22220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22230 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
22240 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
22250 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
22260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
22290 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
222a0 6e 61 70 73 68 6f 74 4f 70 65 6e 28 70 50 61 67  napshotOpen(pPag
222b0 65 72 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a  er, pSnapshot);.
222c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
222d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
222e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
222f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
22300 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74  eeBeginTrans(pBt
22310 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
22320 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
22330 6e 61 70 73 68 6f 74 4f 70 65 6e 28 70 50 61 67  napshotOpen(pPag
22340 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
22350 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 55  }.        if( bU
22360 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
22370 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
22380 6e 61 70 73 68 6f 74 55 6e 6c 6f 63 6b 28 70 50  napshotUnlock(pP
22390 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ager);.        }
223a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
223b0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
223c0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
223d0 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f  tex);.#endif   /
223e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
223f0 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  L */.  return rc
22400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 76  ;.}../*.** Recov
22410 65 72 20 61 73 20 6d 61 6e 79 20 73 6e 61 70 73  er as many snaps
22420 68 6f 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65  hots as possible
22430 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69   from the wal fi
22440 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
22450 74 68 0a 2a 2a 20 73 63 68 65 6d 61 20 7a 44 62  th.** schema zDb
22460 20 6f 66 20 64 61 74 61 62 61 73 65 20 64 62 2e   of database db.
22470 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
22480 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72  snapshot_recover
22490 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
224a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
224b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
224c0 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69  E_ERROR;.  int i
224d0 44 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  Db;.#ifndef SQLI
224e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66  TE_OMIT_WAL..#if
224f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
22500 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
22510 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
22520 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
22530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22540 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
22550 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
22560 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
22570 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 44  db->mutex);.  iD
22580 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
22590 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
225a0 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20    if( iDb==0 || 
225b0 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72  iDb>1 ){.    Btr
225c0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
225d0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
225e0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74  if( 0==sqlite3Bt
225f0 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73  reeIsInReadTrans
22600 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
22610 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22620 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
22630 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
22640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22650 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
22660 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
22670 68 6f 74 52 65 63 6f 76 65 72 28 73 71 6c 69 74  hotRecover(sqlit
22680 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
22690 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
226a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
226b0 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Bt);.      }.   
226c0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
226d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
226e0 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
226f0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
22700 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
22710 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
22720 65 65 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61  ee a snapshot ha
22730 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 66 72  ndle obtained fr
22740 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  om sqlite3_snaps
22750 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f  hot_get()..*/.vo
22760 69 64 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  id sqlite3_snaps
22770 68 6f 74 5f 66 72 65 65 28 73 71 6c 69 74 65 33  hot_free(sqlite3
22780 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
22790 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  shot){.  sqlite3
227a0 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29  _free(pSnapshot)
227b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
227c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
227d0 53 48 4f 54 20 2a 2f 0a 0a 53 51 4c 49 54 45 5f  SHOT */..SQLITE_
227e0 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 69 6e 74  EXPERIMENTAL int
227f0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 69 6e 66   sqlite3_wal_inf
22800 6f 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o(.  sqlite3 *db
22810 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
22820 62 2c 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  b, .  unsigned i
22830 6e 74 20 2a 70 6e 50 72 69 6f 72 2c 20 75 6e 73  nt *pnPrior, uns
22840 69 67 6e 65 64 20 69 6e 74 20 2a 70 6e 46 72 61  igned int *pnFra
22850 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  me.){.  int rc =
22860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
22870 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22880 5f 57 41 4c 0a 20 20 42 74 72 65 65 20 2a 70 42  _WAL.  Btree *pB
22890 74 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 23  t;.  int iDb;..#
228a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
228b0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
228c0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
228d0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
228e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
228f0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
22900 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
22910 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22920 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
22930 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
22940 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
22950 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b  ;.  if( iDb<0 ){
22960 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22970 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
22980 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  pBt = db->aDb[iD
22990 62 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d 20 73  b].pBt;.  rc = s
229a0 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 49 6e  qlite3PagerWalIn
229b0 66 6f 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  fo(sqlite3BtreeP
229c0 61 67 65 72 28 70 42 74 29 2c 20 70 6e 50 72 69  ager(pBt), pnPri
229d0 6f 72 2c 20 70 6e 46 72 61 6d 65 29 3b 0a 20 20  or, pnFrame);.  
229e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
229f0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
22a00 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49  #endif   /* SQLI
22a10 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
22a20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22a30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22a40 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f  MIT_COMPILEOPTIO
22a50 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69  N_DIAGS./*.** Gi
22a60 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
22a70 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  a compile-time o
22a80 70 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 74 72  ption, return tr
22a90 75 65 20 69 66 20 74 68 61 74 20 6f 70 74 69 6f  ue if that optio
22aa0 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 61 6e  n.** was used an
22ab0 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
22ac0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20 63  **.** The name c
22ad0 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65  an optionally be
22ae0 67 69 6e 20 77 69 74 68 20 22 53 51 4c 49 54 45  gin with "SQLITE
22af0 5f 22 20 62 75 74 20 74 68 65 20 22 53 51 4c 49  _" but the "SQLI
22b00 54 45 5f 22 20 70 72 65 66 69 78 0a 2a 2a 20 69  TE_" prefix.** i
22b10 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66  s not required f
22b20 6f 72 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69  or a match..*/.i
22b30 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69  nt sqlite3_compi
22b40 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63 6f  leoption_used(co
22b50 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61  nst char *zOptNa
22b60 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  me){.  int i, n;
22b70 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63  .  int nOpt;.  c
22b80 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f  onst char **azCo
22b90 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a 23 69 66 20  mpileOpt;. .#if 
22ba0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
22bb0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 7a 4f  I_ARMOR.  if( zO
22bc0 70 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ptName==0 ){.   
22bd0 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
22be0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
22bf0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
22c00 64 69 66 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c 65  dif..  azCompile
22c10 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  Opt = sqlite3Com
22c20 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70  pileOptions(&nOp
22c30 74 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  t);..  if( sqlit
22c40 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e  e3StrNICmp(zOptN
22c50 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f 22 2c 20  ame, "SQLITE_", 
22c60 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d 65  7)==0 ) zOptName
22c70 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20 73 71 6c   += 7;.  n = sql
22c80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
22c90 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 69  tName);..  /* Si
22ca0 6e 63 65 20 6e 4f 70 74 20 69 73 20 6e 6f 72 6d  nce nOpt is norm
22cb0 61 6c 6c 79 20 69 6e 20 73 69 6e 67 6c 65 20 64  ally in single d
22cc0 69 67 69 74 73 2c 20 61 20 6c 69 6e 65 61 72 20  igits, a linear 
22cd0 73 65 61 72 63 68 20 69 73 20 0a 20 20 2a 2a 20  search is .  ** 
22ce0 61 64 65 71 75 61 74 65 2e 20 4e 6f 20 6e 65 65  adequate. No nee
22cf0 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 73  d for a binary s
22d00 65 61 72 63 68 2e 20 2a 2f 0a 20 20 66 6f 72 28  earch. */.  for(
22d10 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b  i=0; i<nOpt; i++
22d20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
22d30 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e  e3StrNICmp(zOptN
22d40 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f 70  ame, azCompileOp
22d50 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  t[i], n)==0.    
22d60 20 26 26 20 73 71 6c 69 74 65 33 49 73 49 64 43   && sqlite3IsIdC
22d70 68 61 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68  har((unsigned ch
22d80 61 72 29 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b  ar)azCompileOpt[
22d90 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20 29 7b  i][n])==0.    ){
22da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
22db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22dc0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22dd0 52 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20  Return the N-th 
22de0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
22df0 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49 66 20  ion string.  If 
22e00 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  N is out of rang
22e10 65 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 4e  e,.** return a N
22e20 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
22e30 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
22e40 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  te3_compileoptio
22e50 6e 5f 67 65 74 28 69 6e 74 20 4e 29 7b 0a 20 20  n_get(int N){.  
22e60 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73  int nOpt;.  cons
22e70 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69  t char **azCompi
22e80 6c 65 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d 70 69  leOpt;.  azCompi
22e90 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43  leOpt = sqlite3C
22ea0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e  ompileOptions(&n
22eb0 4f 70 74 29 3b 0a 20 20 69 66 28 20 4e 3e 3d 30  Opt);.  if( N>=0
22ec0 20 26 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20   && N<nOpt ){.  
22ed0 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6d 70 69    return azCompi
22ee0 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20  leOpt[N];.  }.  
22ef0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
22f00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
22f10 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f  T_COMPILEOPTION_
22f20 44 49 41 47 53 20 2a 2f 0a                       DIAGS */.