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

Artifact 9465ba2bfc021f5c2ec1f58fc97c55b123d277ad0993c49a2f333df9da483f8f:


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 28 73 71 6c 69 74 65 33 5f 69  c( sz*(sqlite3_i
63e0: 6e 74 36 34 29 63 6e 74 20 29 3b 20 20 2f 2a 20  nt64)cnt );  /* 
63f0: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
6400: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
6410: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
6420: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
6430: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
6440: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
6450: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
6460: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
6470: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
6480: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6490: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
64a0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 20  lookaside.pInit 
64b0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
64c0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
64d0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
64e0: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
64f0: 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
6500: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f    int i;.    Loo
6510: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20  kasideSlot *p;. 
6520: 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20     assert( sz > 
6530: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
6540: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20  asideSlot*) );. 
6550: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6560: 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a 20 20  .nSlot = cnt;.  
6570: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
6580: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
6590: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
65a0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
65b0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
65c0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74 3b  lookaside.pInit;
65d0: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
65e0: 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70 3b 0a  side.pInit = p;.
65f0: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
6600: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
6610: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
6620: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6630: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
6640: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
6650: 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  sable = 0;.    d
6660: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6670: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
6680: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
6690: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
66a0: 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20  e.pStart = db;. 
66b0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
66c0: 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20  .pEnd = db;.    
66d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
66e0: 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  isable = 1;.    
66f0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6700: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 20  alloced = 0;.   
6710: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
6720: 53 6c 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  Slot = 0;.  }.#e
6730: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6740: 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f  MIT_LOOKASIDE */
6750: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6760: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6770: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
6780: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
6790: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
67a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
67b0: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
67c0: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
67d0: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
67e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
67f0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
6800: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
6810: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
6820: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
6830: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
6840: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
6850: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74    return db->mut
6860: 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ex;.}../*.** Fre
6870: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
6880: 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66 72  ory as we can fr
6890: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  om the given dat
68a0: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
68b0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
68c0: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
68d0: 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64  emory(sqlite3 *d
68e0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  b){.  int i;..#i
68f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6900: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6910: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6920: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
6930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6940: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
6950: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6960: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
6970: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
6980: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
6990: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
69a0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
69b0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
69c0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
69d0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
69e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
69f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6a00: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
6a10: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
6a20: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
6a30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
6a40: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
6a50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6a60: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6a70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6a80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6a90: 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79 20  Flush any dirty 
6aa0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
6ab0: 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e 79  er-cache for any
6ac0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6ad0: 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  se.** to disk..*
6ae0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6af0: 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c 69  _cacheflush(sqli
6b00: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
6b10: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
6b20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62  LITE_OK;.  int b
6b30: 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a 23  SeenBusy = 0;..#
6b40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6b50: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
6b60: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
6b70: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
6b80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6b90: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
6ba0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
6bb0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6bc0: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
6bd0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
6be0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
6bf0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
6c00: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6c10: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6c20: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6c30: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
6c40: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6c50: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
6c60: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
6c70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6c80: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
6c90: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
6ca0: 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a 20  Flush(pPager);. 
6cb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6cc0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
6cd0: 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d 20      bSeenBusy = 
6ce0: 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
6cf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
6d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
6d10: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
6d20: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
6d30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6d40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
6d50: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
6d60: 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73 79  _OK && bSeenBusy
6d70: 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ) ? SQLITE_BUSY 
6d80: 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
6d90: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
6da0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
6db0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
6dc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
6dd0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
6de0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
6df0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
6e00: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6e10: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
6e20: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
6e30: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
6e40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
6e50: 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45  ONFIG_MAINDBNAME
6e60: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50  : {.      /* IMP
6e70: 3a 20 52 2d 30 36 38 32 34 2d 32 38 35 33 31 20  : R-06824-28531 
6e80: 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  */.      /* IMP:
6e90: 20 52 2d 33 36 32 35 37 2d 35 32 31 32 35 20 2a   R-36257-52125 *
6ea0: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  /.      db->aDb[
6eb0: 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 76 61  0].zDbSName = va
6ec0: 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a  _arg(ap,char*);.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  E_OK;.      brea
6ef0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6f00: 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  e SQLITE_DBCONFI
6f10: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
6f20: 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20       void *pBuf 
6f30: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
6f40: 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  d*); /* IMP: R-2
6f50: 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20  6835-10964 */.  
6f60: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
6f70: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6f80: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37      /* IMP: R-47
6f90: 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20  871-25994 */.   
6fa0: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f     int cnt = va_
6fb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6fc0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34     /* IMP: R-044
6fd0: 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20  60-53386 */.    
6fe0: 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b    rc = setupLook
6ff0: 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20  aside(db, pBuf, 
7000: 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20  sz, cnt);.      
7010: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7020: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
7030: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
7040: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20  truct {.        
7050: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20  int op;      /* 
7060: 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  The opcode */.  
7070: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20        u32 mask; 
7080: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68     /* Mask of th
7090: 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33  e bit in sqlite3
70a0: 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c  .flags to set/cl
70b0: 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61  ear */.      } a
70c0: 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  FlagOp[] = {.   
70d0: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
70e0: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
70f0: 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  EY,           SQ
7100: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
7110: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
7120: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7130: 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c  _ENABLE_TRIGGER,
7140: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
7150: 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c  nableTrigger  },
7160: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7170: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7180: 45 5f 56 49 45 57 2c 20 20 20 20 20 20 20 20 20  E_VIEW,         
7190: 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 56    SQLITE_EnableV
71a0: 69 65 77 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  iew     },.     
71b0: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
71c0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33  NFIG_ENABLE_FTS3
71d0: 5f 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49  _TOKENIZER, SQLI
71e0: 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
71f0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
7200: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
7210: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
7220: 53 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61  SION, SQLITE_Loa
7230: 64 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20  dExtension  },. 
7240: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7250: 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
7260: 5f 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20  _ON_CLOSE,      
7270: 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43  SQLITE_NoCkptOnC
7280: 6c 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20  lose  },.       
7290: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
72a0: 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20  IG_ENABLE_QPSG, 
72b0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
72c0: 5f 45 6e 61 62 6c 65 51 50 53 47 20 20 20 20 20  _EnableQPSG     
72d0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
72e0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
72f0: 47 47 45 52 5f 45 51 50 2c 20 20 20 20 20 20 20  GGER_EQP,       
7300: 20 20 20 20 53 51 4c 49 54 45 5f 54 72 69 67 67      SQLITE_Trigg
7310: 65 72 45 51 50 20 20 20 20 20 7d 2c 0a 20 20 20  erEQP     },.   
7320: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7330: 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54  CONFIG_RESET_DAT
7340: 41 42 41 53 45 2c 20 20 20 20 20 20 20 20 53 51  ABASE,        SQ
7350: 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61  LITE_ResetDataba
7360: 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  se  },.        {
7370: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7380: 5f 44 45 46 45 4e 53 49 56 45 2c 20 20 20 20 20  _DEFENSIVE,     
7390: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
73a0: 65 66 65 6e 73 69 76 65 20 20 20 20 20 20 7d 2c  efensive      },
73b0: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
73c0: 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41  E_DBCONFIG_WRITA
73d0: 42 4c 45 5f 53 43 48 45 4d 41 2c 20 20 20 20 20  BLE_SCHEMA,     
73e0: 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63    SQLITE_WriteSc
73f0: 68 65 6d 61 7c 0a 20 20 20 20 20 20 20 20 20 20  hema|.          
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 6f         SQLITE_No
7430: 53 63 68 65 6d 61 45 72 72 6f 72 20 20 7d 2c 0a  SchemaError  },.
7440: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
7450: 5f 44 42 43 4f 4e 46 49 47 5f 4c 45 47 41 43 59  _DBCONFIG_LEGACY
7460: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 2c 20 20 20  _ALTER_TABLE,   
7470: 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 41 6c   SQLITE_LegacyAl
7480: 74 65 72 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  ter    },.      
7490: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
74a0: 46 49 47 5f 44 51 53 5f 44 44 4c 2c 20 20 20 20  FIG_DQS_DDL,    
74b0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
74c0: 45 5f 44 71 73 44 44 4c 20 20 20 20 20 20 20 20  E_DqsDDL        
74d0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
74e0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51  LITE_DBCONFIG_DQ
74f0: 53 5f 44 4d 4c 2c 20 20 20 20 20 20 20 20 20 20  S_DML,          
7500: 20 20 20 20 20 53 51 4c 49 54 45 5f 44 71 73 44       SQLITE_DqsD
7510: 4d 4c 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ML         },.  
7520: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
7530: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
7540: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
7550: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
7560: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
7570: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7580: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
7590: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
75a0: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
75b0: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
75c0: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
75d0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
75e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
75f0: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
7600: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
7610: 20 20 20 20 75 36 34 20 6f 6c 64 46 6c 61 67 73      u64 oldFlags
7620: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
7630: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
7640: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
7650: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
7660: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
7670: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7680: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
7690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
76a0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29  >flags &= ~(u64)
76b0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
76c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
76d0: 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c         if( oldFl
76e0: 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29  ags!=db->flags )
76f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
7700: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
7710: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
7720: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7730: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
7740: 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pRes ){.        
7750: 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d      *pRes = (db-
7760: 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70  >flags & aFlagOp
7770: 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  [i].mask)!=0;.  
7780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7790: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
77a0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OK;.          br
77b0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
77c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
77d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
77e0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
77f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7800: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65  * This is the de
7810: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
7820: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
7830: 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73  BINARY" which is
7840: 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c   always.** avail
7850: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
7860: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
7870: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
7880: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
7890: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
78a0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
78b0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
78c0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
78d0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
78e0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
78f0: 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20  n = nKey1<nKey2 
7900: 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b  ? nKey1 : nKey2;
7910: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
7920: 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39  F: R-65033-28449
7930: 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49   The built-in BI
7940: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  NARY collation c
7950: 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72  ompares.  ** str
7960: 69 6e 67 73 20 62 79 74 65 20 62 79 20 62 79 74  ings byte by byt
7970: 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63  e using the memc
7980: 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72  mp() function fr
7990: 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
79a0: 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20  C.  ** library. 
79b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  */.  assert( pKe
79c0: 79 31 20 26 26 20 70 4b 65 79 32 20 29 3b 0a 20  y1 && pKey2 );. 
79d0: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
79e0: 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
79f0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
7a00: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
7a10: 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key2;.  }.  retu
7a20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7a30: 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 6c 6c  This is the coll
7a40: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
7a50: 61 6d 65 64 20 22 52 54 52 49 4d 22 20 77 68 69  amed "RTRIM" whi
7a60: 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  ch is always.** 
7a70: 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 67 6e 6f  available.  Igno
7a80: 72 65 20 74 72 61 69 6c 69 6e 67 20 73 70 61 63  re trailing spac
7a90: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
7aa0: 74 20 72 74 72 69 6d 43 6f 6c 6c 46 75 6e 63 28  t rtrimCollFunc(
7ab0: 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 2c 0a  .  void *pUser,.
7ac0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
7ad0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
7ae0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
7af0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
7b00: 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b  {.  const u8 *pK
7b10: 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  1 = (const u8*)p
7b20: 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 38  Key1;.  const u8
7b30: 20 2a 70 4b 32 20 3d 20 28 63 6f 6e 73 74 20 75   *pK2 = (const u
7b40: 38 2a 29 70 4b 65 79 32 3b 0a 20 20 77 68 69 6c  8*)pKey2;.  whil
7b50: 65 28 20 6e 4b 65 79 31 20 26 26 20 70 4b 31 5b  e( nKey1 && pK1[
7b60: 6e 4b 65 79 31 2d 31 5d 3d 3d 27 20 27 20 29 20  nKey1-1]==' ' ) 
7b70: 6e 4b 65 79 31 2d 2d 3b 0a 20 20 77 68 69 6c 65  nKey1--;.  while
7b80: 28 20 6e 4b 65 79 32 20 26 26 20 70 4b 32 5b 6e  ( nKey2 && pK2[n
7b90: 4b 65 79 32 2d 31 5d 3d 3d 27 20 27 20 29 20 6e  Key2-1]==' ' ) n
7ba0: 4b 65 79 32 2d 2d 3b 0a 20 20 72 65 74 75 72 6e  Key2--;.  return
7bb0: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 70 55 73   binCollFunc(pUs
7bc0: 65 72 2c 20 6e 4b 65 79 31 2c 20 70 4b 65 79 31  er, nKey1, pKey1
7bd0: 2c 20 6e 4b 65 79 32 2c 20 70 4b 65 79 32 29 3b  , nKey2, pKey2);
7be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7bf0: 20 74 72 75 65 20 69 66 20 43 6f 6c 6c 53 65 71   true if CollSeq
7c00: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
7c10: 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 2e  built-in BINARY.
7c20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
7c30: 73 42 69 6e 61 72 79 28 63 6f 6e 73 74 20 43 6f  sBinary(const Co
7c40: 6c 6c 53 65 71 20 2a 70 29 7b 0a 20 20 61 73 73  llSeq *p){.  ass
7c50: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
7c60: 78 43 6d 70 21 3d 62 69 6e 43 6f 6c 6c 46 75 6e  xCmp!=binCollFun
7c70: 63 20 7c 7c 20 73 74 72 63 6d 70 28 70 2d 3e 7a  c || strcmp(p->z
7c80: 4e 61 6d 65 2c 22 42 49 4e 41 52 59 22 29 3d 3d  Name,"BINARY")==
7c90: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3d  0 );.  return p=
7ca0: 3d 30 20 7c 7c 20 70 2d 3e 78 43 6d 70 3d 3d 62  =0 || p->xCmp==b
7cb0: 69 6e 43 6f 6c 6c 46 75 6e 63 3b 0a 7d 0a 0a 2f  inCollFunc;.}../
7cc0: 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69  *.** Another bui
7cd0: 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20  lt-in collating 
7ce0: 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45  sequence: NOCASE
7cf0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  . .**.** This co
7d00: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7d10: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
7d20: 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73  be used for "cas
7d30: 65 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a  e independent.**
7d40: 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51   comparison". SQ
7d50: 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65  Lite's knowledge
7d60: 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   of upper and lo
7d70: 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c  wer case equival
7d80: 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20  ents.** extends 
7d90: 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63  only to the 26 c
7da0: 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69  haracters used i
7db0: 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61  n the English la
7dc0: 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74  nguage..**.** At
7dd0: 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72   the moment ther
7de0: 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d  e is only a UTF-
7df0: 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  8 implementation
7e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7e10: 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
7e20: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
7e30: 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
7e40: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
7e50: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
7e60: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
7e70: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20  Key2.){.  int r 
7e80: 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  = sqlite3StrNICm
7e90: 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20  p(.      (const 
7ea0: 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63  char *)pKey1, (c
7eb0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79  onst char *)pKey
7ec0: 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29  2, (nKey1<nKey2)
7ed0: 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20  ?nKey1:nKey2);. 
7ee0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
7ef0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  R(NotUsed);.  if
7f00: 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20  ( 0==r ){.    r 
7f10: 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20  = nKey1-nKey2;. 
7f20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
7f30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7f40: 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  he ROWID of the 
7f50: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
7f60: 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74  rt.*/.sqlite_int
7f70: 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  64 sqlite3_last_
7f80: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c  insert_rowid(sql
7f90: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
7fa0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7fb0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7fc0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7fd0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
7fe0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
7ff0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
8000: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
8010: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
8020: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  >lastRowid;.}../
8030: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
8040: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
8050: 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  he sqlite3_last_
8060: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41  insert_rowid() A
8070: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
8080: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 65 74  void sqlite3_set
8090: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
80a0: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
80b0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
80c0: 6f 77 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51  owid){.#ifdef SQ
80d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
80e0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
80f0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
8100: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
8110: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
8120: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
8130: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
8140: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
8150: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
8160: 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20    db->lastRowid 
8170: 3d 20 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69  = iRowid;.  sqli
8180: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
8190: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  db->mutex);.}../
81a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
81b0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
81c0: 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  s in the most re
81d0: 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
81e0: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a  ite3_exec()..*/.
81f0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  int sqlite3_chan
8200: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
8210: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
8220: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
8230: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
8240: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
8250: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
8260: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
8270: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
8280: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
8290: 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b  urn db->nChange;
82a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
82b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
82c0: 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65  hanges since the
82d0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
82e0: 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a   was opened..*/.
82f0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  int sqlite3_tota
8300: 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  l_changes(sqlite
8310: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
8320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
8330: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
8340: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
8350: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
8360: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
8370: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
8380: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
8390: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54  .  return db->nT
83a0: 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  otalChange;.}../
83b0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f  *.** Close all o
83c0: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
83d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  This function on
83e0: 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66  ly manipulates f
83f0: 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20  ields of the.** 
8400: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
8410: 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20  object, it does 
8420: 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61  not close any sa
8430: 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61  vepoints that ma
8440: 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20  y be open.** at 
8450: 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72  the b-tree/pager
8460: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20   level..*/.void 
8470: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
8480: 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  points(sqlite3 *
8490: 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62  db){.  while( db
84a0: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->pSavepoint ){.
84b0: 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70      Savepoint *p
84c0: 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  Tmp = db->pSavep
84d0: 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53  oint;.    db->pS
84e0: 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d  avepoint = pTmp-
84f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
8500: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
8510: 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e  mp);.  }.  db->n
8520: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
8530: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
8540: 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61  = 0;.  db->isTra
8550: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
8560: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
8570: 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  Invoke the destr
8580: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61  uctor function a
8590: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46  ssociated with F
85a0: 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79  uncDef p, if any
85b0: 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20  . Except,.** if 
85c0: 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
85d0: 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65  last copy of the
85e0: 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f   function, do no
85f0: 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c  t invoke it. Mul
8600: 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20  tiple.** copies 
8610: 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63  of a single func
8620: 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64  tion are created
8630: 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e   when create_fun
8640: 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65  ction() is calle
8650: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
8660: 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f  _ANY as the enco
8670: 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ding..*/.static 
8680: 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73  void functionDes
8690: 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62  troy(sqlite3 *db
86a0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20  , FuncDef *p){. 
86b0: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
86c0: 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  *pDestructor = p
86d0: 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 3b  ->u.pDestructor;
86e0: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
86f0: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
8700: 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  uctor->nRef--;. 
8710: 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74     if( pDestruct
8720: 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  or->nRef==0 ){. 
8730: 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72       pDestructor
8740: 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74  ->xDestroy(pDest
8750: 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74  ructor->pUserDat
8760: 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
8770: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73  3DbFree(db, pDes
8780: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
8790: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73    }.}../*.** Dis
87a0: 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69  connect all sqli
87b0: 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73  te3_vtab objects
87c0: 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
87d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
87e0: 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20  ion.** db. This 
87f0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64  is called when d
8800: 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65  b is being close
8810: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8820: 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  d disconnectAllV
8830: 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tab(sqlite3 *db)
8840: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
8850: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8860: 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61  LE.  int i;.  Ha
8870: 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c  shElem *p;.  sql
8880: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
8890: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
88a0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
88b0: 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ){.    Schema *p
88c0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
88d0: 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [i].pSchema;.   
88e0: 20 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a   if( pSchema ){.
88f0: 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69        for(p=sqli
8900: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
8910: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
8920: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
8930: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20  ext(p)){.       
8940: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28   Table *pTab = (
8950: 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  Table *)sqliteHa
8960: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20  shData(p);.     
8970: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
8980: 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33  (pTab) ) sqlite3
8990: 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64  VtabDisconnect(d
89a0: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
89b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
89c0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
89d0: 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  rst(&db->aModule
89e0: 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61  ); p; p=sqliteHa
89f0: 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20  shNext(p)){.    
8a00: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
8a10: 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48  Module *)sqliteH
8a20: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
8a30: 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  if( pMod->pEpoTa
8a40: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
8a50: 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74  e3VtabDisconnect
8a60: 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54  (db, pMod->pEpoT
8a70: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
8a80: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
8a90: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71  ckList(db);.  sq
8aa0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
8ab0: 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20  ll(db);.#else.  
8ac0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8ad0: 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  (db);.#endif.}..
8ae0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
8af0: 45 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  E if database co
8b00: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20  nnection db has 
8b10: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70  unfinalized prep
8b20: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
8b30: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
8b40: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8b50: 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74  objects.  .*/.st
8b60: 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74  atic int connect
8b70: 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65  ionIsBusy(sqlite
8b80: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b  3 *db){.  int j;
8b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8ba0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
8bb0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8bc0: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65  ( db->pVdbe ) re
8bd0: 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d  turn 1;.  for(j=
8be0: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
8bf0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
8c00: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  Bt = db->aDb[j].
8c10: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
8c20: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
8c30: 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20  IsInBackup(pBt) 
8c40: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
8c50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
8c60: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78  *.** Close an ex
8c70: 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61  isting SQLite da
8c80: 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63  tabase.*/.static
8c90: 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73   int sqlite3Clos
8ca0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
8cb0: 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b  nt forceZombie){
8cc0: 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
8cd0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
8ce0: 3a 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30 20  : R-63257-11740 
8cf0: 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  Calling sqlite3_
8d00: 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20 2a  close() or.    *
8d10: 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  * sqlite3_close_
8d20: 76 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c 4c  v2() with a NULL
8d30: 20 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e   pointer argumen
8d40: 74 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  t is a harmless 
8d50: 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65  no-op. */.    re
8d60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d70: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
8d80: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
8d90: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
8da0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
8db0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
8dc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8dd0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
8de0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54 72 61  ;.  if( db->mTra
8df0: 63 65 20 26 20 53 51 4c 49 54 45 5f 54 52 41 43  ce & SQLITE_TRAC
8e00: 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 64  E_CLOSE ){.    d
8e10: 62 2d 3e 78 54 72 61 63 65 28 53 51 4c 49 54 45  b->xTrace(SQLITE
8e20: 5f 54 52 41 43 45 5f 43 4c 4f 53 45 2c 20 64 62  _TRACE_CLOSE, db
8e30: 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 64 62 2c  ->pTraceArg, db,
8e40: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46   0);.  }..  /* F
8e50: 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74  orce xDisconnect
8e60: 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69   calls on all vi
8e70: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a  rtual tables */.
8e80: 20 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56    disconnectAllV
8e90: 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  tab(db);..  /* I
8ea0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
8eb0: 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73  is open, the dis
8ec0: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29  connectAllVtab()
8ed0: 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a   call above.  **
8ee0: 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63   will not have c
8ef0: 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f  alled the xDisco
8f00: 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f  nnect() method o
8f10: 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20  n any virtual.  
8f20: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
8f30: 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61   db->aVTrans[] a
8f40: 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  rray. The follow
8f50: 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62 52  ing sqlite3VtabR
8f60: 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63  ollback().  ** c
8f70: 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20  all will do so. 
8f80: 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68  We need to do th
8f90: 69 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 68  is before the ch
8fa0: 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20  eck for active. 
8fb0: 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
8fc0: 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65  ts below, as the
8fd0: 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65   v-table impleme
8fe0: 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73  ntation may be s
8ff0: 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65  toring.  ** some
9000: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9010: 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  ents internally.
9020: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
9030: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
9040: 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65  ..  /* Legacy be
9050: 68 61 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f  havior (sqlite3_
9060: 63 6c 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72  close() behavior
9070: 29 20 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20  ) is to return. 
9080: 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   ** SQLITE_BUSY 
9090: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
90a0: 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f  n can not be clo
90b0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  sed immediately.
90c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72  .  */.  if( !for
90d0: 63 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e  ceZombie && conn
90e0: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29  ectionIsBusy(db)
90f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
9100: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
9110: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
9120: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
9130: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
9140: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
9150: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
9160: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
9170: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9180: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9190: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
91a0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
91b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
91c0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
91d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
91e0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
91f0: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20  .    /* Closing 
9200: 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72  the handle. Four
9210: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
9220: 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
9230: 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74   2. */.    sqlit
9240: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
9250: 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c  Sqllog(sqlite3Gl
9260: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
9270: 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29  ogArg, db, 0, 2)
9280: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
9290: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63  /* Convert the c
92a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  onnection into a
92b0: 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e   zombie and then
92c0: 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a   close it..  */.
92d0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
92e0: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
92f0: 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76  E;.  sqlite3Leav
9300: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
9310: 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75  mbie(db);.  retu
9320: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9330: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61  ./*.** Two varia
9340: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62  tions on the pub
9350: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f  lic interface fo
9360: 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61  r closing a data
9370: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
9380: 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  on. The sqlite3_
9390: 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20  close() version 
93a0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
93b0: 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65  USY and.** leave
93c0: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
93d0: 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65   option if there
93e0: 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64   are unfinalized
93f0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
9400: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
9410: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
9420: 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69  ckups.  The sqli
9430: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a  te3_close_v2().*
9440: 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73  * version forces
9450: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9460: 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62  to become a zomb
9470: 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  ie if there are.
9480: 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f  ** unclosed reso
9490: 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e  urces, and arran
94a0: 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ges for dealloca
94b0: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61  tion when the la
94c0: 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74  st.** prepare st
94d0: 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74  atement or sqlit
94e0: 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73  e3_backup closes
94f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9500: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
9510: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
9520: 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20  te3Close(db,0); 
9530: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  }.int sqlite3_cl
9540: 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a  ose_v2(sqlite3 *
9550: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
9560: 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20  te3Close(db,1); 
9570: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
9580: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  the mutex on dat
9590: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
95a0: 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68   db..**.** Furth
95b0: 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62  ermore, if datab
95c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
95d0: 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d  b is a zombie (m
95e0: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72  eaning that ther
95f0: 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20  e.** has been a 
9600: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
9610: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
9620: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
9630: 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20  _v2(db)) and.** 
9640: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74  every sqlite3_st
9650: 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  mt has now been 
9660: 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76  finalized and ev
9670: 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ery sqlite3_back
9680: 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  up has.** finish
9690: 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c  ed, then free al
96a0: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  l resources..*/.
96b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76  void sqlite3Leav
96c0: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
96d0: 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  mbie(sqlite3 *db
96e0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
96f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9700: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
9710: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
9720: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66   int j;..  /* If
9730: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
9740: 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73  anding sqlite3_s
9750: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  tmt or sqlite3_b
9760: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20  ackup objects.  
9770: 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e  ** or if the con
9780: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  nection has not 
9790: 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20  yet been closed 
97a0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  by sqlite3_close
97b0: 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  _v2(),.  ** then
97c0: 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20   just leave the 
97d0: 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e  mutex and return
97e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
97f0: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
9800: 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63  AGIC_ZOMBIE || c
9810: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
9820: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
9830: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9840: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
9850: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
9860: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
9870: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
9880: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
9890: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
98a0: 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61  as.  ** closed a
98b0: 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ll sqlite3_stmt 
98c0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  and sqlite3_back
98d0: 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68  up objects and h
98e0: 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73  as been.  ** pas
98f0: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  sed to sqlite3_c
9900: 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  lose (meaning th
9910: 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69  at it is a zombi
9920: 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a  e).  Therefore,.
9930: 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
9940: 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  d free all resou
9950: 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  rces..  */..  /*
9960: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
9970: 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20  n is open, roll 
9980: 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c  it back. This al
9990: 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  so ensures that 
99a0: 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61  if.  ** any data
99b0: 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76  base schemas hav
99c0: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
99d0: 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65  by an uncommitte
99e0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d transaction.  
99f0: 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65  ** they are rese
9a00: 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  t. And that the 
9a10: 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20  required b-tree 
9a20: 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f  mutex is held to
9a30: 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70   make.  ** the p
9a40: 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ager rollback an
9a50: 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61  d schema reset a
9a60: 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69  n atomic operati
9a70: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
9a80: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
9a90: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f  SQLITE_OK);..  /
9aa0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
9ab0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
9ac0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
9ad0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
9ae0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
9af0: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
9b00: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9b10: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
9b20: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
9b30: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
9b40: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
9b50: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
9b60: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
9b70: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
9b80: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
9b90: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
9ba0: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
9bb0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
9bc0: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
9bd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
9be0: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
9bf0: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
9c00: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
9c10: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
9c20: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
9c30: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
9c40: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
9c50: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
9c60: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
9c70: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
9c80: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
9c90: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
9ca0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
9cb0: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
9cc0: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
9cd0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
9ce0: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
9cf0: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
9d00: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
9d10: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
9d20: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
9d30: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
9d40: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
9d50: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
9d60: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
9d70: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
9d80: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
9d90: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
9da0: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
9db0: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
9dc0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
9dd0: 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b  rst(&db->aFunc);
9de0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
9df0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 46 75  Next(i)){.    Fu
9e00: 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70  ncDef *pNext, *p
9e10: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
9e20: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
9e30: 20 64 6f 7b 0a 20 20 20 20 20 20 66 75 6e 63 74   do{.      funct
9e40: 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70  ionDestroy(db, p
9e50: 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
9e60: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20   p->pNext;.     
9e70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9e80: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 20 3d  b, p);.      p =
9e90: 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 77 68 69   pNext;.    }whi
9ea0: 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a 20 20 73  le( p );.  }.  s
9eb0: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
9ec0: 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 66  &db->aFunc);.  f
9ed0: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9ee0: 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  irst(&db->aCollS
9ef0: 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  eq); i; i=sqlite
9f00: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9f10: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9f20: 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71   = (CollSeq *)sq
9f30: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
9f40: 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61  .    /* Invoke a
9f50: 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72  ny destructors r
9f60: 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f  egistered for co
9f70: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
9f80: 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20   user data. */. 
9f90: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
9fa0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
9fb0: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29   pColl[j].xDel )
9fc0: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b  {.        pColl[
9fd0: 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d  j].xDel(pColl[j]
9fe0: 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d  .pUser);.      }
9ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a000: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
a010: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
a020: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
a030: 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
a040: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a050: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66  VIRTUALTABLE.  f
a060: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
a070: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
a080: 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  e); i; i=sqliteH
a090: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
a0a0: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
a0b0: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
a0c0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
a0d0: 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74   if( pMod->xDest
a0e0: 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f  roy ){.      pMo
a0f0: 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64  d->xDestroy(pMod
a100: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20  ->pAux);.    }. 
a110: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 45 70     sqlite3VtabEp
a120: 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61  onymousTableClea
a130: 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20  r(db, pMod);.   
a140: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a150: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20  b, pMod);.  }.  
a160: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
a170: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
a180: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
a190: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
a1a0: 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  E_OK); /* Deallo
a1b0: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
a1c0: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
a1d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  */.  sqlite3Valu
a1e0: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
a1f0: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
a200: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23  xtensions(db);.#
a210: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
a220: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
a230: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
a240: 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29  >auth.zAuthUser)
a250: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a260: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50  (db->auth.zAuthP
a270: 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  W);.#endif..  db
a280: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
a290: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
a2a0: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
a2b0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
a2c0: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
a2d0: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
a2e0: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
a2f0: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
a300: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
a310: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
a320: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
a330: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
a340: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
a350: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
a360: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
a370: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
a380: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
a390: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
a3a0: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
a3b0: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
a3c0: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
a3d0: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
a3e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a3f0: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
a400: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
a410: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
a420: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
a430: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
a440: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
a450: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
a460: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
a470: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a480: 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62  LookasideUsed(db
a490: 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ,0)==0 );.  if( 
a4a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
a4b0: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
a4c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
a4d0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
a4e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
a4f0: 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  _free(db);.}../*
a500: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
a510: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
a520: 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73    If tripCode is
a530: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20   not SQLITE_OK, 
a540: 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74  then.** any writ
a550: 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  e cursors are in
a560: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
a570: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
a580: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
a590: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
a5a0: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
a5b0: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
a5c0: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
a5d0: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
a5e0: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
a5f0: 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72 73  r.  Read cursors
a600: 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64   remain open and
a610: 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72   valid.** but ar
a620: 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61 73  e "saved" in cas
a630: 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67 65  e the table page
a640: 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f 75  s are moved arou
a650: 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nd..*/.void sqli
a660: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73  te3RollbackAll(s
a670: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
a680: 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
a690: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
a6a0: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63 68  s = 0;.  int sch
a6b0: 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73 73  emaChange;.  ass
a6c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a6d0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
a6e0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
a6f0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
a700: 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  ();..  /* Obtain
a710: 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74 65   all b-tree mute
a720: 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  xes before makin
a730: 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42  g any calls to B
a740: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  treeRollback(). 
a750: 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6d  .  ** This is im
a760: 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65 20  portant in case 
a770: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
a780: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
a790: 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66  k has.  ** modif
a7a0: 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
a7b0: 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65 20   schema. If the 
a7c0: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 61  b-tree mutexes a
a7d0: 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a  re not taken.  *
a7e0: 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f  * here, then ano
a7f0: 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
a800: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67  e connection mig
a810: 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74 77  ht sneak in betw
a820: 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  een.  ** the dat
a830: 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61  abase rollback a
a840: 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 2c  nd schema reset,
a850: 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73 65   which can cause
a860: 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72   false.  ** corr
a870: 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20 69  uption reports i
a880: 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a  n some cases.  *
a890: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
a8a0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
a8b0: 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28  schemaChange = (
a8c0: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44  db->mDbFlags & D
a8d0: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
a8e0: 67 65 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e  ge)!=0 && db->in
a8f0: 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66  it.busy==0;..  f
a900: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
a910: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
a920: 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b  ee *p = db->aDb[
a930: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
a940: 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  p ){.      if( s
a950: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
a960: 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20  rans(p) ){.     
a970: 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a     inTrans = 1;.
a980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a990: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
a9a0: 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  ck(p, tripCode, 
a9b0: 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a  !schemaChange);.
a9c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
a9d0: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
a9e0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e  db);.  sqlite3En
a9f0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
aa00: 0a 0a 20 20 69 66 28 20 73 63 68 65 6d 61 43 68  ..  if( schemaCh
aa10: 61 6e 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  ange ){.    sqli
aa20: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
aa30: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20  dStatements(db, 
aa40: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  0);.    sqlite3R
aa50: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
aa60: 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
aa70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
aa80: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
aa90: 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72  .  /* Any deferr
aaa0: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ed constraint vi
aab0: 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f  olations have no
aac0: 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  w been resolved.
aad0: 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72   */.  db->nDefer
aae0: 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64  redCons = 0;.  d
aaf0: 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
ab00: 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66  ons = 0;.  db->f
ab10: 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29 53 51  lags &= ~(u64)SQ
ab20: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a  LITE_DeferFKs;..
ab30: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20    /* If one has 
ab40: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
ab50: 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c   invoke the roll
ab60: 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61  back-hook callba
ab70: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ck */.  if( db->
ab80: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
ab90: 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c  k && (inTrans ||
aba0: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
abb0: 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f  ) ){.    db->xRo
abc0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64  llbackCallback(d
abd0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29  b->pRollbackArg)
abe0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
abf0: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
ac00: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
ac10: 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73   the name corres
ac20: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65  ponding to the e
ac30: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65  rror code.** spe
ac40: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72  cified in the ar
ac50: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64  gument..*/.#if d
ac60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45  efined(SQLITE_NE
ac70: 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e  ED_ERR_NAME).con
ac80: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
ac90: 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b  ErrName(int rc){
aca0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
acb0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
acc0: 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a  i, origRc = rc;.
acd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26    for(i=0; i<2 &
ace0: 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c  & zName==0; i++,
acf0: 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20   rc &= 0xff){.  
ad00: 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a    switch( rc ){.
ad10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad20: 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20  E_OK:           
ad30: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ad40: 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20  QLITE_OK";      
ad50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ad60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ad70: 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20  TE_ERROR:       
ad80: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ad90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20  SQLITE_ERROR";  
ada0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
adb0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
adc0: 49 54 45 5f 45 52 52 4f 52 5f 53 4e 41 50 53 48  ITE_ERROR_SNAPSH
add0: 4f 54 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  OT:     zName = 
ade0: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e  "SQLITE_ERROR_SN
adf0: 41 50 53 48 4f 54 22 3b 20 20 20 20 62 72 65 61  APSHOT";    brea
ae00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae10: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20  LITE_INTERNAL:  
ae20: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ae30: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
ae40: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
ae50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae60: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
ae70: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ae80: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
aea0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aeb0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20  SQLITE_ABORT:   
aec0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
aed0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
aee0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
aef0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
af00: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
af10: 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d  LLBACK:     zNam
af20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
af30: 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20  T_ROLLBACK";    
af40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
af50: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
af70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
af80: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
af90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
afa0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  se SQLITE_BUSY_R
afb0: 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e  ECOVERY:      zN
afc0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
afd0: 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20  SY_RECOVERY";   
afe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aff0: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
b000: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a  SNAPSHOT:      z
b010: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
b020: 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  USY_SNAPSHOT";  
b030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b040: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
b050: 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED:             
b060: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b070: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20  LOCKED";        
b080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b090: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
b0a0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a  KED_SHAREDCACHE:
b0b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b0c0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
b0d0: 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  CHE";break;.    
b0e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
b0f0: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
b100: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b110: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
b120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b130: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
b140: 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20  EADONLY:        
b150: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b160: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
b170: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b180: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b190: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
b1a0: 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  Y:  zName = "SQL
b1b0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
b1c0: 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20  OVERY"; break;. 
b1d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b1e0: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e  _READONLY_CANTIN
b1f0: 49 54 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  IT:  zName = "SQ
b200: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
b210: 4e 54 49 4e 49 54 22 3b 20 62 72 65 61 6b 3b 0a  NTINIT"; break;.
b220: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b230: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
b240: 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ACK:  zName = "S
b250: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
b260: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
b270: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b280: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
b290: 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  VED:   zName = "
b2a0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b2b0: 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b  DBMOVED";  break
b2c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b2d0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52  ITE_READONLY_DIR
b2e0: 45 43 54 4f 52 59 3a 20 7a 4e 61 6d 65 20 3d 20  ECTORY: zName = 
b2f0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
b300: 5f 44 49 52 45 43 54 4f 52 59 22 3b 62 72 65 61  _DIRECTORY";brea
b310: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b320: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20  LITE_INTERRUPT: 
b330: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b340: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55   "SQLITE_INTERRU
b350: 50 54 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  PT";         bre
b360: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b370: 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20  QLITE_IOERR:    
b380: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b390: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22  = "SQLITE_IOERR"
b3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
b3b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b3c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
b3d0: 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  D:         zName
b3e0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b3f0: 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20 20 62  _READ";        b
b400: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b410: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b420: 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d  ORT_READ:   zNam
b430: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b440: 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20  R_SHORT_READ";  
b450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b460: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  e SQLITE_IOERR_W
b470: 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61  RITE:        zNa
b480: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b490: 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20  RR_WRITE";      
b4a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b4b0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b4c0: 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e  FSYNC:        zN
b4d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b4e0: 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20  ERR_FSYNC";     
b4f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b500: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b510: 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a  _DIR_FSYNC:    z
b520: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b530: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b  OERR_DIR_FSYNC";
b540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b550: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b560: 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20  R_TRUNCATE:     
b570: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b580: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b  IOERR_TRUNCATE";
b590: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b5a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b5b0: 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20  RR_FSTAT:       
b5c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b5d0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20  _IOERR_FSTAT";  
b5e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b5f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b600: 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20  ERR_UNLOCK:     
b610: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b620: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b  E_IOERR_UNLOCK";
b630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b640: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b650: 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20  OERR_RDLOCK:    
b660: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b670: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22  TE_IOERR_RDLOCK"
b680: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b690: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b6a0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20  IOERR_DELETE:   
b6b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b6c0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b6d0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b6e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b6f0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20  _IOERR_NOMEM:   
b700: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b710: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
b720: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b730: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b740: 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20  E_IOERR_ACCESS: 
b750: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b760: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
b770: 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  SS";      break;
b780: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b790: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
b7a0: 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20  SERVEDLOCK:.    
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b7d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b7e0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
b7f0: 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OCK"; break;.   
b800: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b810: 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20  OERR_LOCK:      
b820: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b830: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20  TE_IOERR_LOCK"; 
b840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b850: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b860: 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20  IOERR_CLOSE:    
b870: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b880: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22  ITE_IOERR_CLOSE"
b890: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b8a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b8b0: 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
b8c0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
b8d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
b8e0: 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a  LOSE";   break;.
b8f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b900: 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a  E_IOERR_SHMOPEN:
b910: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b920: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
b930: 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  PEN";     break;
b940: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b950: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
b960: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b970: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b980: 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b  SIZE";     break
b990: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b9a0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43  ITE_IOERR_SHMLOC
b9b0: 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  K:      zName = 
b9c0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b9d0: 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61  MLOCK";     brea
b9e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b9f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
ba00: 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  P:       zName =
ba10: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
ba20: 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65  HMMAP";      bre
ba30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ba40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
ba50: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
ba60: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ba70: 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72  SEEK";        br
ba80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
baa0: 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65  ETE_NOENT: zName
bab0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
bac0: 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62  _DELETE_NOENT";b
bad0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bae0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d   SQLITE_IOERR_MM
baf0: 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AP:         zNam
bb00: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
bb10: 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20  R_MMAP";        
bb20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bb30: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  e SQLITE_IOERR_G
bb40: 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61  ETTEMPPATH:  zNa
bb50: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
bb60: 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b  RR_GETTEMPPATH";
bb70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bb80: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
bb90: 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e  CONVPATH:     zN
bba0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
bbb0: 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20  ERR_CONVPATH";  
bbc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bbd0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
bbe0: 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  PT:            z
bbf0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bc00: 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ORRUPT";        
bc10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bc20: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
bc30: 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20  UPT_VTAB:       
bc40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bc50: 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20  CORRUPT_VTAB";  
bc60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bc70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
bc80: 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20  FOUND:          
bc90: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bca0: 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20  _NOTFOUND";     
bcb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bcc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
bcd0: 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
bce0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bcf0: 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20  E_FULL";        
bd00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bd10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bd20: 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20  ANTOPEN:        
bd30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bd40: 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20  TE_CANTOPEN";   
bd50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bd60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bd70: 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44  CANTOPEN_NOTEMPD
bd80: 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  IR: zName = "SQL
bd90: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54  ITE_CANTOPEN_NOT
bda0: 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20  EMPDIR";break;. 
bdb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bdc0: 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a  _CANTOPEN_ISDIR:
bdd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bde0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
bdf0: 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DIR";    break;.
be00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
be10: 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
be20: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
be30: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
be40: 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  ULLPATH"; break;
be50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be60: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56  TE_CANTOPEN_CONV
be70: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
be80: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
be90: 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b  CONVPATH"; break
bea0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
beb0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20  ITE_PROTOCOL:   
bec0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bed0: 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  "SQLITE_PROTOCOL
bee0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
bef0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bf00: 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20  LITE_EMPTY:     
bf10: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bf20: 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b   "SQLITE_EMPTY";
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
bf40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bf50: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20  QLITE_SCHEMA:   
bf60: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bf70: 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  = "SQLITE_SCHEMA
bf80: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
bf90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bfa0: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20  SQLITE_TOOBIG:  
bfb0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bfc0: 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49   = "SQLITE_TOOBI
bfd0: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  G";            b
bfe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bff0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c000: 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  NT:         zNam
c010: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
c020: 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20  TRAINT";        
c030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c040: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c050: 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61  INT_UNIQUE:  zNa
c060: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
c070: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b  STRAINT_UNIQUE";
c080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c090: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c0a0: 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e  AINT_TRIGGER: zN
c0b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c0c0: 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
c0d0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
c0e0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c0f0: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
c100: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c120: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c130: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
c140: 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61  EIGNKEY";   brea
c150: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c160: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c170: 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d  CHECK:   zName =
c180: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
c190: 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65  INT_CHECK";  bre
c1a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c1b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c1c0: 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20  _PRIMARYKEY:.   
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c1f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
c200: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
c210: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
c220: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c230: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
c240: 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  LL: zName = "SQL
c250: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
c260: 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20  OTNULL";break;. 
c270: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c280: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
c290: 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20  ITHOOK:.        
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c2c0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
c2d0: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20  NT_COMMITHOOK"; 
c2e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c2f0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c300: 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a  RAINT_VTAB:    z
c310: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c320: 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b  ONSTRAINT_VTAB";
c330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c340: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
c350: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a  TRAINT_FUNCTION:
c360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c390: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
c3a0: 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  TION";     break
c3b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c3c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
c3d0: 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OWID:   zName = 
c3e0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
c3f0: 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61  NT_ROWID";  brea
c400: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c410: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20  LITE_MISMATCH:  
c420: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c430: 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43   "SQLITE_MISMATC
c440: 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  H";          bre
c450: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c460: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20  QLITE_MISUSE:   
c470: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c480: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  = "SQLITE_MISUSE
c490: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
c4a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c4b0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20  SQLITE_NOLFS:   
c4c0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
c4d0: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   = "SQLITE_NOLFS
c4e0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
c4f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c500: 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20   SQLITE_AUTH:   
c510: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c520: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48  e = "SQLITE_AUTH
c530: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
c540: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c550: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c570: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52  me = "SQLITE_FOR
c580: 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  MAT";           
c590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c5a0: 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a  se SQLITE_RANGE:
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c5c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41  ame = "SQLITE_RA
c5d0: 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  NGE";           
c5e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c5f0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  ase SQLITE_NOTAD
c600: 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  B:             z
c610: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c620: 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20  OTADB";         
c630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c640: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a  case SQLITE_ROW:
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c660: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c670: 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROW";           
c680: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c690: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
c6a0: 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ICE:            
c6b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c6c0: 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20  _NOTICE";       
c6d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c6e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c6f0: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c  TICE_RECOVER_WAL
c700: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
c710: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
c720: 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20  _WAL";break;.   
c730: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c740: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
c750: 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20  LLBACK:.        
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c780: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
c790: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22  ECOVER_ROLLBACK"
c7a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
c7b0: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
c7c0: 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  NG:            z
c7d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
c7e0: 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20  ARNING";        
c7f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c800: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
c810: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20  ING_AUTOINDEX:  
c820: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c830: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
c840: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  X"; break;.     
c850: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e   case SQLITE_DON
c860: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
c870: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c880: 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20  _DONE";         
c890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c8a0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  }.  }.  if( zNam
c8b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e==0 ){.    stat
c8c0: 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  ic char zBuf[50]
c8d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
c8e0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
c8f0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49  uf), zBuf, "SQLI
c900: 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c  TE_UNKNOWN(%d)",
c910: 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e   origRc);.    zN
c920: 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a  ame = zBuf;.  }.
c930: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
c940: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c950: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
c960: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
c970: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
c980: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
c990: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
c9a0: 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ment..*/.const c
c9b0: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53  har *sqlite3ErrS
c9c0: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74  tr(int rc){.  st
c9d0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a  atic const char*
c9e0: 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20   const aMsg[] = 
c9f0: 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  {.    /* SQLITE_
ca00: 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22  OK          */ "
ca10: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20  not an error",. 
ca20: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52     /* SQLITE_ERR
ca30: 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c  OR       */ "SQL
ca40: 20 6c 6f 67 69 63 20 65 72 72 6f 72 22 2c 0a 20   logic error",. 
ca50: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
ca60: 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20  ERNAL    */ 0,. 
ca70: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52     /* SQLITE_PER
ca80: 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63  M        */ "acc
ca90: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ess permission d
caa0: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
cab0: 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20  QLITE_ABORT     
cac0: 20 20 2a 2f 20 22 71 75 65 72 79 20 61 62 6f 72    */ "query abor
cad0: 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ted",.    /* SQL
cae0: 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20 20  ITE_BUSY        
caf0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73 20  */ "database is 
cb00: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
cb10: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20  SQLITE_LOCKED   
cb20: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
cb30: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22  table is locked"
cb40: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cb50: 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22  NOMEM       */ "
cb60: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a  out of memory",.
cb70: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45      /* SQLITE_RE
cb80: 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74  ADONLY    */ "at
cb90: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61  tempt to write a
cba0: 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61   readonly databa
cbb0: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
cbc0: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a  TE_INTERRUPT   *
cbd0: 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c  / "interrupted",
cbe0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
cbf0: 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64  OERR       */ "d
cc00: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a  isk I/O error",.
cc10: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
cc20: 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61  RRUPT     */ "da
cc30: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
cc40: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c  e is malformed",
cc50: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
cc60: 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75  OTFOUND    */ "u
cc70: 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e  nknown operation
cc80: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cc90: 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20  _FULL        */ 
cca0: 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73  "database or dis
ccb0: 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20  k is full",.    
ccc0: 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  /* SQLITE_CANTOP
ccd0: 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65  EN    */ "unable
cce0: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
ccf0: 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20  e file",.    /* 
cd00: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20  SQLITE_PROTOCOL 
cd10: 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70     */ "locking p
cd20: 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a  rotocol",.    /*
cd30: 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20   SQLITE_EMPTY   
cd40: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
cd50: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20   SQLITE_SCHEMA  
cd60: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
cd70: 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
cd80: 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ged",.    /* SQL
cd90: 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20  ITE_TOOBIG      
cda0: 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c  */ "string or bl
cdb0: 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20  ob too big",.   
cdc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   /* SQLITE_CONST
cdd0: 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74  RAINT  */ "const
cde0: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20  raint failed",. 
cdf0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
ce00: 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74  MATCH    */ "dat
ce10: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c  atype mismatch",
ce20: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
ce30: 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 62  ISUSE      */ "b
ce40: 61 64 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20  ad parameter or 
ce50: 6f 74 68 65 72 20 41 50 49 20 6d 69 73 75 73 65  other API misuse
ce60: 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ",.#ifdef SQLITE
ce70: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 20 20 20  _DISABLE_LFS.   
ce80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
ce90: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
cea0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
ceb0: 20 64 69 73 61 62 6c 65 64 22 2c 0a 23 65 6c 73   disabled",.#els
cec0: 65 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  e.    /* SQLITE_
ced0: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 30  NOLFS       */ 0
cee0: 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ,.#endif.    /* 
cef0: 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20  SQLITE_AUTH     
cf00: 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61     */ "authoriza
cf10: 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  tion denied",.  
cf20: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d    /* SQLITE_FORM
cf30: 41 54 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20  AT      */ 0,.  
cf40: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47    /* SQLITE_RANG
cf50: 45 20 20 20 20 20 20 20 2a 2f 20 22 63 6f 6c 75  E       */ "colu
cf60: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
cf70: 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  range",.    /* S
cf80: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20  QLITE_NOTADB    
cf90: 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 6e 6f    */ "file is no
cfa0: 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20  t a database",. 
cfb0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
cfc0: 49 43 45 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74  ICE      */ "not
cfd0: 69 66 69 63 61 74 69 6f 6e 20 6d 65 73 73 61 67  ification messag
cfe0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
cff0: 45 5f 57 41 52 4e 49 4e 47 20 20 20 20 20 2a 2f  E_WARNING     */
d000: 20 22 77 61 72 6e 69 6e 67 20 6d 65 73 73 61 67   "warning messag
d010: 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74  e",.  };.  const
d020: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75   char *zErr = "u
d030: 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20  nknown error";. 
d040: 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
d050: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
d060: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b  BORT_ROLLBACK: {
d070: 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61  .      zErr = "a
d080: 62 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c  bort due to ROLL
d090: 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65  BACK";.      bre
d0a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d0b0: 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 7b  se SQLITE_ROW: {
d0c0: 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61  .      zErr = "a
d0d0: 6e 6f 74 68 65 72 20 72 6f 77 20 61 76 61 69 6c  nother row avail
d0e0: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 62 72 65  able";.      bre
d0f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d100: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20  se SQLITE_DONE: 
d110: 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22  {.      zErr = "
d120: 6e 6f 20 6d 6f 72 65 20 72 6f 77 73 20 61 76 61  no more rows ava
d130: 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 62  ilable";.      b
d140: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d150: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
d160: 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 20   rc &= 0xff;.   
d170: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 72 63     if( ALWAYS(rc
d180: 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72 61 79  >=0) && rc<Array
d190: 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20 61 4d  Size(aMsg) && aM
d1a0: 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20  sg[rc]!=0 ){.   
d1b0: 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d 73 67       zErr = aMsg
d1c0: 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [rc];.      }.  
d1d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d1e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45  .  }.  return zE
d1f0: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rr;.}../*.** Thi
d200: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
d210: 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c  ents a busy call
d220: 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73  back that sleeps
d230: 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67   and tries.** ag
d240: 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65  ain until a time
d250: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61  out value is rea
d260: 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f  ched.  The timeo
d270: 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  ut value is.** a
d280: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
d290: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
d2a0: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68   passed in as th
d2b0: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
d2c0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ent..**.** Retur
d2d0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 72 65  n non-zero to re
d2e0: 74 72 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 52  try the lock.  R
d2f0: 65 74 75 72 6e 20 7a 65 72 6f 20 74 6f 20 73 74  eturn zero to st
d300: 6f 70 20 74 72 79 69 6e 67 0a 2a 2a 20 61 6e 64  op trying.** and
d310: 20 63 61 75 73 65 20 53 51 4c 69 74 65 20 74 6f   cause SQLite to
d320: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
d330: 55 53 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  USY..*/.static i
d340: 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  nt sqliteDefault
d350: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 20  BusyCallback(.  
d360: 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20  void *ptr,      
d370: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
d380: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d390: 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 2c 20  */.  int count, 
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3b0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
d3c0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
d3d0: 62 75 73 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  busy */.  sqlite
d3e0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 20 20  3_file *pFile   
d3f0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 6f     /* The file o
d400: 6e 20 77 68 69 63 68 20 74 68 65 20 6c 6f 63 6b  n which the lock
d410: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
d420: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
d430: 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50  N || HAVE_USLEEP
d440: 0a 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20  .  /* This case 
d450: 69 73 20 66 6f 72 20 73 79 73 74 65 6d 73 20 74  is for systems t
d460: 68 61 74 20 68 61 76 65 20 73 75 70 70 6f 72 74  hat have support
d470: 20 66 6f 72 20 73 6c 65 65 70 69 6e 67 20 66 6f   for sleeping fo
d480: 72 20 66 72 61 63 74 69 6f 6e 73 20 6f 66 0a 20  r fractions of. 
d490: 20 2a 2a 20 61 20 73 65 63 6f 6e 64 2e 20 20 45   ** a second.  E
d4a0: 78 61 6d 70 6c 65 73 3a 20 20 41 6c 6c 20 77 69  xamples:  All wi
d4b0: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2c 20 75  ndows systems, u
d4c0: 6e 69 78 20 73 79 73 74 65 6d 73 20 77 69 74 68  nix systems with
d4d0: 20 75 73 6c 65 65 70 28 29 20 2a 2f 0a 20 20 73   usleep() */.  s
d4e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64  tatic const u8 d
d4f0: 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  elays[] =.     {
d500: 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35   1, 2, 5, 10, 15
d510: 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32  , 20, 25, 25,  2
d520: 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30  5,  50,  50, 100
d530: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
d540: 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d  st u8 totals[] =
d550: 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c  .     { 0, 1, 3,
d560: 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c    8, 18, 33, 53,
d570: 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31   78, 103, 128, 1
d580: 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66  78, 228 };.# def
d590: 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79  ine NDELAY Array
d5a0: 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73  Size(delays).  s
d5b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
d5c0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
d5d0: 6e 74 20 74 6d 6f 75 74 20 3d 20 64 62 2d 3e 62  nt tmout = db->b
d5e0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e  usyTimeout;.  in
d5f0: 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a  t delay, prior;.
d600: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d610: 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45  NABLE_SETLK_TIME
d620: 4f 55 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  OUT.  if( sqlite
d630: 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
d640: 46 69 6c 65 2c 53 51 4c 49 54 45 5f 46 43 4e 54  File,SQLITE_FCNT
d650: 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 26  L_LOCK_TIMEOUT,&
d660: 74 6d 6f 75 74 29 3d 3d 53 51 4c 49 54 45 5f 4f  tmout)==SQLITE_O
d670: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 75  K ){.    if( cou
d680: 6e 74 20 29 7b 0a 20 20 20 20 20 20 74 6d 6f 75  nt ){.      tmou
d690: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
d6a0: 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
d6b0: 6c 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  l(pFile, SQLITE_
d6c0: 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f  FCNTL_LOCK_TIMEO
d6d0: 55 54 2c 20 26 74 6d 6f 75 74 29 3b 0a 20 20 20  UT, &tmout);.   
d6e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
d6f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
d700: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
d710: 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
d720: 5f 50 41 52 41 4d 45 54 45 52 28 70 46 69 6c 65  _PARAMETER(pFile
d730: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
d740: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
d750: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
d760: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
d770: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
d780: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
d790: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
d7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
d7b0: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
d7c0: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
d7d0: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
d7e0: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
d7f0: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
d800: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
d810: 64 65 6c 61 79 20 3e 20 74 6d 6f 75 74 20 29 7b  delay > tmout ){
d820: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 6d 6f  .    delay = tmo
d830: 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20  ut - prior;.    
d840: 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72  if( delay<=0 ) r
d850: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
d860: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
d870: 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30  ->pVfs, delay*10
d880: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
d890: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 54 68 69 73  .#else.  /* This
d8a0: 20 63 61 73 65 20 66 6f 72 20 75 6e 69 78 20 73   case for unix s
d8b0: 79 73 74 65 6d 73 20 74 68 61 74 20 6c 61 63 6b  ystems that lack
d8c0: 20 75 73 6c 65 65 70 28 29 20 73 75 70 70 6f 72   usleep() suppor
d8d0: 74 2e 20 20 53 6c 65 65 70 69 6e 67 0a 20 20 2a  t.  Sleeping.  *
d8e0: 2a 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 69  * must be done i
d8f0: 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 6f 66 20  n increments of 
d900: 77 68 6f 6c 65 20 73 65 63 6f 6e 64 73 20 2a 2f  whole seconds */
d910: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d920: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
d930: 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d 20 28  .  int tmout = (
d940: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
d950: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
d960: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d970: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 28  (pFile);.  if( (
d980: 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20  count+1)*1000 > 
d990: 74 6d 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  tmout ){.    ret
d9a0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
d9b0: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
d9c0: 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a  pVfs, 1000000);.
d9d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
d9e0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  if.}../*.** Invo
d9f0: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73  ke the given bus
da00: 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a  y handler..**.**
da10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
da20: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
da30: 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  operation failed
da40: 20 74 6f 20 61 63 71 75 69 72 65 20 61 0a 2a 2a   to acquire a.**
da50: 20 6c 6f 63 6b 20 6f 6e 20 56 46 53 20 66 69 6c   lock on VFS fil
da60: 65 20 70 46 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e pFile..**.** I
da70: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
da80: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
da90: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
daa0: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
dab0: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
dac0: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
dad0: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
dae0: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
daf0: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
db00: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
db10: 61 6e 64 6c 65 72 20 2a 70 2c 20 73 71 6c 69 74  andler *p, sqlit
db20: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
db30: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
db40: 20 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72   p->xBusyHandler
db50: 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c  ==0 || p->nBusy<
db60: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
db70: 69 66 28 20 70 2d 3e 62 45 78 74 72 61 46 69 6c  if( p->bExtraFil
db80: 65 41 72 67 20 29 7b 0a 20 20 20 20 2f 2a 20 41  eArg ){.    /* A
db90: 64 64 20 61 6e 20 65 78 74 72 61 20 70 61 72 61  dd an extra para
dba0: 6d 65 74 65 72 20 77 69 74 68 20 74 68 65 20 70  meter with the p
dbb0: 46 69 6c 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  File pointer to 
dbc0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
dbd0: 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61     ** callback a
dbe0: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a  rgument list */.
dbf0: 20 20 20 20 69 6e 74 20 28 2a 78 54 72 61 29 28      int (*xTra)(
dc00: 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  void*,int,sqlite
dc10: 33 5f 66 69 6c 65 2a 29 3b 0a 20 20 20 20 78 54  3_file*);.    xT
dc20: 72 61 20 3d 20 28 69 6e 74 28 2a 29 28 76 6f 69  ra = (int(*)(voi
dc30: 64 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 66  d*,int,sqlite3_f
dc40: 69 6c 65 2a 29 29 70 2d 3e 78 42 75 73 79 48 61  ile*))p->xBusyHa
dc50: 6e 64 6c 65 72 3b 0a 20 20 20 20 72 63 20 3d 20  ndler;.    rc = 
dc60: 78 54 72 61 28 70 2d 3e 70 42 75 73 79 41 72 67  xTra(p->pBusyArg
dc70: 2c 20 70 2d 3e 6e 42 75 73 79 2c 20 70 46 69 6c  , p->nBusy, pFil
dc80: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
dc90: 20 2f 2a 20 4c 65 67 61 63 79 20 73 74 79 6c 65   /* Legacy style
dca0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 63 61   busy handler ca
dcb0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 72 63  llback */.    rc
dcc0: 20 3d 20 70 2d 3e 78 42 75 73 79 48 61 6e 64 6c   = p->xBusyHandl
dcd0: 65 72 28 70 2d 3e 70 42 75 73 79 41 72 67 2c 20  er(p->pBusyArg, 
dce0: 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 7d 0a 20  p->nBusy);.  }. 
dcf0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
dd00: 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b    p->nBusy = -1;
dd10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
dd20: 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20  >nBusy++;.  }.  
dd30: 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f  return rc; .}../
dd40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
dd50: 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20  e sets the busy 
dd60: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20  callback for an 
dd70: 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  Sqlite database 
dd80: 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  to the.** given 
dd90: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
dda0: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
ddb0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
ddc0: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68  t sqlite3_busy_h
ddd0: 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65  andler(.  sqlite
dde0: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78  3 *db,.  int (*x
ddf0: 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29  Busy)(void*,int)
de00: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
de10: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
de20: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
de30: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
de40: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
de50: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
de60: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
de70: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
de80: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
de90: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73  utex);.  db->bus
dea0: 79 48 61 6e 64 6c 65 72 2e 78 42 75 73 79 48 61  yHandler.xBusyHa
deb0: 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 3b 0a 20  ndler = xBusy;. 
dec0: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
ded0: 2e 70 42 75 73 79 41 72 67 20 3d 20 70 41 72 67  .pBusyArg = pArg
dee0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
def0: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
df00: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
df10: 2e 62 45 78 74 72 61 46 69 6c 65 41 72 67 20 3d  .bExtraFileArg =
df20: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69   0;.  db->busyTi
df30: 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c  meout = 0;.  sql
df40: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
df50: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
df60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
df70: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
df80: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
df90: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
dfa0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
dfb0: 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  s the progress c
dfc0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
dfd0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
dfe0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
dff0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
e000: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
e010: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72  argument. The pr
e020: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
e030: 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  will.** be invok
e040: 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70  ed every nOps op
e050: 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  codes..*/.void s
e060: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
e070: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
e080: 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e  e3 *db, .  int n
e090: 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72  Ops,.  int (*xPr
e0a0: 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20  ogress)(void*), 
e0b0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
e0c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e0d0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e0e0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
e0f0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
e100: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
e110: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e130: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
e140: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e150: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
e160: 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62  nOps>0 ){.    db
e170: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50  ->xProgress = xP
e180: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d  rogress;.    db-
e190: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
e1a0: 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a  (unsigned)nOps;.
e1b0: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
e1c0: 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d  sArg = pArg;.  }
e1d0: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50  else{.    db->xP
e1e0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
e1f0: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
e200: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70  s = 0;.    db->p
e210: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b  ProgressArg = 0;
e220: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
e230: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e240: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
e250: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e260: 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20  tine installs a 
e270: 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e  default busy han
e280: 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73 20  dler that waits 
e290: 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  for the.** speci
e2a0: 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d  fied number of m
e2b0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f  illiseconds befo
e2c0: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a  re returning 0..
e2d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
e2e0: 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69  usy_timeout(sqli
e2f0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29  te3 *db, int ms)
e300: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e310: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e320: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
e330: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
e340: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e350: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
e360: 6e 64 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20  ndif.  if( ms>0 
e370: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
e380: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
e390: 28 69 6e 74 28 2a 29 28 76 6f 69 64 2a 2c 69 6e  (int(*)(void*,in
e3a0: 74 29 29 73 71 6c 69 74 65 44 65 66 61 75 6c 74  t))sqliteDefault
e3b0: 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 0a 20 20  BusyCallback,.  
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
e3e0: 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62  *)db);.    db->b
e3f0: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b  usyTimeout = ms;
e400: 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  .    db->busyHan
e410: 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c 65 41  dler.bExtraFileA
e420: 72 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rg = 1;.  }else{
e430: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
e440: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c  y_handler(db, 0,
e450: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
e460: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e470: 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20  /*.** Cause any 
e480: 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f  pending operatio
e490: 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73  n to stop at its
e4a0: 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74   earliest opport
e4b0: 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  unity..*/.void s
e4c0: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
e4d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
e4e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e4f0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e500: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
e510: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 26 26  tyCheckOk(db) &&
e520: 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d   (db==0 || db->m
e530: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
e540: 49 43 5f 5a 4f 4d 42 49 45 29 20 29 7b 0a 20 20  IC_ZOMBIE) ){.  
e550: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
e560: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
e570: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
e580: 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e  if.  db->u1.isIn
e590: 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d  terrupted = 1;.}
e5a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
e5b0: 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c  nction is exactl
e5c0: 79 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  y the same as sq
e5d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e5e0: 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a  ction(), except.
e5f0: 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 64 65  ** that it is de
e600: 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c  signed to be cal
e610: 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20  led by internal 
e620: 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65 72  code. The differ
e630: 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20  ence is.** that 
e640: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
e650: 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63  ils in sqlite3_c
e660: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
e670: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  , an error code.
e680: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
e690: 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69  nd the mallocFai
e6a0: 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64  led flag cleared
e6b0: 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
e6c0: 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73  3CreateFunc(.  s
e6d0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
e6e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74  nst char *zFunct
e6f0: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
e700: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
e710: 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74    void *pUserDat
e720: 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  a,.  void (*xSFu
e730: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
e740: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e750: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e760: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
e770: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e780: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e790: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
e7a0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
e7b0: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
e7c0: 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33  *xValue)(sqlite3
e7d0: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
e7e0: 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73  id (*xInverse)(s
e7f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e800: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e810: 65 20 2a 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73  e **),.  FuncDes
e820: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
e830: 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65  ctor.){.  FuncDe
e840: 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  f *p;.  int nNam
e850: 65 3b 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c  e;.  int extraFl
e860: 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ags;..  assert( 
e870: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e880: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
e890: 0a 20 20 61 73 73 65 72 74 28 20 78 56 61 6c 75  .  assert( xValu
e8a0: 65 3d 3d 30 20 7c 7c 20 78 53 46 75 6e 63 3d 3d  e==0 || xSFunc==
e8b0: 30 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  0 );.  if( zFunc
e8c0: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 20 20 20 20  tionName==0     
e8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
e8e0: 73 74 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  st have a valid 
e8f0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 78  name */.   || (x
e900: 53 46 75 6e 63 21 3d 30 20 26 26 20 78 46 69 6e  SFunc!=0 && xFin
e910: 61 6c 21 3d 30 29 20 20 20 20 20 20 20 20 2f 2a  al!=0)        /*
e920: 20 4e 6f 74 20 62 6f 74 68 20 78 53 46 75 6e 63   Not both xSFunc
e930: 20 61 6e 64 20 78 46 69 6e 61 6c 20 2a 2f 0a 20   and xFinal */. 
e940: 20 20 7c 7c 20 28 28 78 46 69 6e 61 6c 3d 3d 30    || ((xFinal==0
e950: 29 21 3d 28 78 53 74 65 70 3d 3d 30 29 29 20 20  )!=(xStep==0))  
e960: 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20       /* Both or 
e970: 6e 65 69 74 68 65 72 20 6f 66 20 78 46 69 6e 61  neither of xFina
e980: 6c 20 61 6e 64 20 78 53 74 65 70 20 2a 2f 0a 20  l and xStep */. 
e990: 20 20 7c 7c 20 28 28 78 56 61 6c 75 65 3d 3d 30    || ((xValue==0
e9a0: 29 21 3d 28 78 49 6e 76 65 72 73 65 3d 3d 30 29  )!=(xInverse==0)
e9b0: 29 20 20 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20  )    /* Both or 
e9c0: 6e 65 69 74 68 65 72 20 6f 66 20 78 56 61 6c 75  neither of xValu
e9d0: 65 2c 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 20  e, xInverse */. 
e9e0: 20 20 7c 7c 20 28 6e 41 72 67 3c 2d 31 20 7c 7c    || (nArg<-1 ||
e9f0: 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58   nArg>SQLITE_MAX
ea00: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 0a 20  _FUNCTION_ARG). 
ea10: 20 20 7c 7c 20 28 32 35 35 3c 28 6e 4e 61 6d 65    || (255<(nName
ea20: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
ea30: 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  30( zFunctionNam
ea40: 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  e))).  ){.    re
ea50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
ea60: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
ea70: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
ea80: 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51  UNC_CONSTANT==SQ
ea90: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
eaa0: 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61  IC );.  extraFla
eab0: 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49  gs = enc &  SQLI
eac0: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
ead0: 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49  ;.  enc &= (SQLI
eae0: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c  TE_FUNC_ENCMASK|
eaf0: 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a  SQLITE_ANY);.  .
eb00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
eb10: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49  MIT_UTF16.  /* I
eb20: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
eb30: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
eb40: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
eb50: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
eb60: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
eb70: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
eb80: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
eb90: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
eba0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
ebb0: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
ebc0: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
ebd0: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
ebe0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49   **.  ** If SQLI
ebf0: 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66  TE_ANY is specif
ec00: 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76  ied, add three v
ec10: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  ersions of the f
ec20: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  unction.  ** to 
ec30: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  the hash table..
ec40: 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d    */.  if( enc==
ec50: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a  SQLITE_UTF16 ){.
ec60: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
ec70: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
ec80: 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53  }else if( enc==S
ec90: 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20  QLITE_ANY ){.   
eca0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
ecb0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
ecc0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
ecd0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
ece0: 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c  ITE_UTF8|extraFl
ecf0: 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55  ags,.         pU
ed00: 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c  serData, xSFunc,
ed10: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
ed20: 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65  xValue, xInverse
ed30: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
ed40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ed50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
ed60: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
ed70: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
ed80: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
ed90: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78  QLITE_UTF16LE|ex
eda0: 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  traFlags,.      
edb0: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
edc0: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  SFunc, xStep, xF
edd0: 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49  inal, xValue, xI
ede0: 6e 76 65 72 73 65 2c 20 70 44 65 73 74 72 75 63  nverse, pDestruc
edf0: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tor);.    }.    
ee00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ee10: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
ee20: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
ee30: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
ee40: 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  16BE;.  }.#else.
ee50: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
ee60: 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20  TF8;.#endif.  . 
ee70: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20   /* Check if an 
ee80: 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f  existing functio
ee90: 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72  n is being overr
eea0: 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64  idden or deleted
eeb0: 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e  . If so,.  ** an
eec0: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
eed0: 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74  ve VMs, then ret
eee0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
eef0: 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20   If a function. 
ef00: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65   ** is being ove
ef10: 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20  rridden/deleted 
ef20: 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  but there are no
ef30: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c   active VMs, all
ef40: 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  ow the.  ** oper
ef50: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75  ation to continu
ef60: 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65  e but invalidate
ef70: 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64   all precompiled
ef80: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
ef90: 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  /.  p = sqlite3F
efa0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
efb0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
efc0: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29  Arg, (u8)enc, 0)
efd0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70 2d  ;.  if( p && (p-
efe0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
eff0: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
f000: 29 3d 3d 28 75 33 32 29 65 6e 63 20 26 26 20 70  )==(u32)enc && p
f010: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a  ->nArg==nArg ){.
f020: 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62      if( db->nVdb
f030: 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  eActive ){.     
f040: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
f050: 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
f060: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
f070: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
f080: 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e  /modify user-fun
f090: 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74  ction due to act
f0a0: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
f0b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f0c0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
f0d0: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
f0e0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
f0f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f100: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
f110: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
f120: 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  db, 0);.    }.  
f130: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
f140: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
f150: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
f160: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31  nArg, (u8)enc, 1
f170: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c  );.  assert(p ||
f180: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f190: 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  d);.  if( !p ){.
f1a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f1b0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
f1c0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c  }..  /* If an ol
f1d0: 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  der version of t
f1e0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  he function with
f1f0: 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65   a configured de
f200: 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a  structor is.  **
f210: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
f220: 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
f230: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68  uctor function h
f240: 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69  ere. */.  functi
f250: 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29  onDestroy(db, p)
f260: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 72 75  ;..  if( pDestru
f270: 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73  ctor ){.    pDes
f280: 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b  tructor->nRef++;
f290: 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70 44 65 73  .  }.  p->u.pDes
f2a0: 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72  tructor = pDestr
f2b0: 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63  uctor;.  p->func
f2c0: 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63  Flags = (p->func
f2d0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
f2e0: 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65  UNC_ENCMASK) | e
f2f0: 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74 65 73  xtraFlags;.  tes
f300: 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c  tcase( p->funcFl
f310: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45 54  ags & SQLITE_DET
f320: 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20  ERMINISTIC );.  
f330: 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78 53 46 75  p->xSFunc = xSFu
f340: 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a 20 78 53  nc ? xSFunc : xS
f350: 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c  tep;.  p->xFinal
f360: 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20  ize = xFinal;.  
f370: 70 2d 3e 78 56 61 6c 75 65 20 3d 20 78 56 61 6c  p->xValue = xVal
f380: 75 65 3b 0a 20 20 70 2d 3e 78 49 6e 76 65 72 73  ue;.  p->xInvers
f390: 65 20 3d 20 78 49 6e 76 65 72 73 65 3b 0a 20 20  e = xInverse;.  
f3a0: 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  p->pUserData = p
f3b0: 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e  UserData;.  p->n
f3c0: 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b  Arg = (u16)nArg;
f3d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f3e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f  _OK;.}../*.** Wo
f3f0: 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e 20 75 73  rker function us
f400: 65 64 20 62 79 20 75 74 66 2d 38 20 41 50 49 73  ed by utf-8 APIs
f410: 20 74 68 61 74 20 63 72 65 61 74 65 20 6e 65 77   that create new
f420: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
f430: 2a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  *    sqlite3_cre
f440: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a  ate_function().*
f450: 2a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  *    sqlite3_cre
f460: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
f470: 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 5f  ).**    sqlite3_
f480: 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75  create_window_fu
f490: 6e 63 74 69 6f 6e 28 29 0a 2a 2f 0a 73 74 61 74  nction().*/.stat
f4a0: 69 63 20 69 6e 74 20 63 72 65 61 74 65 46 75 6e  ic int createFun
f4b0: 63 74 69 6f 6e 41 70 69 28 0a 20 20 73 71 6c 69  ctionApi(.  sqli
f4c0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
f4d0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
f4e0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
f4f0: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
f500: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
f510: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f520: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
f530: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
f540: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
f550: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
f560: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
f570: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
f580: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f590: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 56 61 6c  ),.  void (*xVal
f5a0: 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ue)(sqlite3_cont
f5b0: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
f5c0: 78 49 6e 76 65 72 73 65 29 28 73 71 6c 69 74 65  xInverse)(sqlite
f5d0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
f5e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
f5f0: 0a 20 20 76 6f 69 64 28 2a 78 44 65 73 74 72 6f  .  void(*xDestro
f600: 79 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  y)(void*).){.  i
f610: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
f620: 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74  RROR;.  FuncDest
f630: 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30  ructor *pArg = 0
f640: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f650: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f660: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f670: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f680: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f690: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f6a0: 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
f6b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f6c0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
f6d0: 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20  .  if( xDestroy 
f6e0: 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46  ){.    pArg = (F
f6f0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29  uncDestructor *)
f700: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 73 69  sqlite3Malloc(si
f710: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
f720: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
f730: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 73 71  pArg ){.      sq
f740: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
f750: 29 3b 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f  );.      xDestro
f760: 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  y(p);.      goto
f770: 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20   out;.    }.    
f780: 70 41 72 67 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  pArg->nRef = 0;.
f790: 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72      pArg->xDestr
f7a0: 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20  oy = xDestroy;. 
f7b0: 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61     pArg->pUserDa
f7c0: 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63  ta = p;.  }.  rc
f7d0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
f7e0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20  Func(db, zFunc, 
f7f0: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 0a 20  nArg, enc, p, . 
f800: 20 20 20 20 20 78 53 46 75 6e 63 2c 20 78 53 74       xSFunc, xSt
f810: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c  ep, xFinal, xVal
f820: 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70 41  ue, xInverse, pA
f830: 72 67 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 41  rg.  );.  if( pA
f840: 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66  rg && pArg->nRef
f850: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
f860: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
f870: 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79   );.    xDestroy
f880: 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
f890: 5f 66 72 65 65 28 70 41 72 67 29 3b 0a 20 20 7d  _free(pArg);.  }
f8a0: 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73  .. out:.  rc = s
f8b0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
f8c0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
f8d0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f8e0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f8f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
f900: 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20 66  reate new user f
f910: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  unctions..*/.int
f920: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
f930: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
f940: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
f950: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
f960: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
f970: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
f980: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
f990: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f9a0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
f9b0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
f9c0: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
f9d0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
f9e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
f9f0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
fa00: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
fa10: 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  t*).){.  return 
fa20: 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70  createFunctionAp
fa30: 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  i(db, zFunc, nAr
fa40: 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e  g, enc, p, xSFun
fa50: 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20  c, xStep,.      
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46                xF
fa80: 69 6e 61 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  inal, 0, 0, 0);.
fa90: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  }.int sqlite3_cr
faa0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
fab0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
fac0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fad0: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
fae0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
faf0: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
fb00: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
fb10: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
fb20: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
fb30: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
fb40: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
fb50: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
fb60: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
fb70: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
fb80: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
fb90: 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28  oid (*xDestroy)(
fba0: 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 72 65 74  void *).){.  ret
fbb0: 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63 74 69  urn createFuncti
fbc0: 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e 63 2c  onApi(db, zFunc,
fbd0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
fbe0: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  SFunc, xStep,.  
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30 2c 20    xFinal, 0, 0, 
fc20: 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 69 6e 74  xDestroy);.}.int
fc30: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
fc40: 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28  window_function(
fc50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
fc60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
fc70: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
fc80: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
fc90: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
fca0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
fcb0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
fcc0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
fcd0: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
fce0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
fcf0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 56 61 6c  ),.  void (*xVal
fd00: 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ue)(sqlite3_cont
fd10: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
fd20: 78 49 6e 76 65 72 73 65 29 28 73 71 6c 69 74 65  xInverse)(sqlite
fd30: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
fd40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
fd50: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
fd60: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
fd70: 20 20 72 65 74 75 72 6e 20 63 72 65 61 74 65 46    return createF
fd80: 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a  unctionApi(db, z
fd90: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
fda0: 20 70 2c 20 30 2c 20 78 53 74 65 70 2c 0a 20 20   p, 0, xStep,.  
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 20 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65    xFinal, xValue
fde0: 2c 20 78 49 6e 76 65 72 73 65 2c 20 78 44 65 73  , xInverse, xDes
fdf0: 74 72 6f 79 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  troy);.}..#ifnde
fe00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
fe10: 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  F16.int sqlite3_
fe20: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
fe30: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
fe40: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
fe50: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
fe60: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
fe70: 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69   eTextRep,.  voi
fe80: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
fe90: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
fea0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
feb0: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
fec0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
fed0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fee0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fef0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
ff00: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
ff10: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
ff20: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
ff30: 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  nc8;..#ifdef SQL
ff40: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
ff50: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
ff60: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
ff70: 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69 6f  (db) || zFunctio
ff80: 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  nName==0 ) retur
ff90: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
ffa0: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
ffb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ffc0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
ffd0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
ffe0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
fff0: 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33  zFunc8 = sqlite3
10000 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75  Utf16to8(db, zFu
10010 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20  nctionName, -1, 
10020 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
10030 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  VE);.  rc = sqli
10040 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
10050 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20  , zFunc8, nArg, 
10060 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 53 46  eTextRep, p, xSF
10070 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e 61 6c  unc,xStep,xFinal
10080 2c 30 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74  ,0,0,0);.  sqlit
10090 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75  e3DbFree(db, zFu
100a0 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nc8);.  rc = sql
100b0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
100c0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
100d0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
100e0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
100f0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  rc;.}.#endif.../
10100 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
10110 6e 67 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d  ng is the implem
10120 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 53  entation of an S
10130 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  QL function that
10140 20 61 6c 77 61 79 73 0a 2a 2a 20 66 61 69 6c 73   always.** fails
10150 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
10160 65 73 73 61 67 65 20 73 74 61 74 69 6e 67 20 74  essage stating t
10170 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
10180 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 0a   is used in the.
10190 2a 2a 20 77 72 6f 6e 67 20 63 6f 6e 74 65 78 74  ** wrong context
101a0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6f  .  The sqlite3_o
101b0 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
101c0 28 29 20 41 50 49 20 6d 69 67 68 74 20 63 6f 6e  () API might con
101d0 73 74 72 75 63 74 0a 2a 2a 20 53 51 4c 20 66 75  struct.** SQL fu
101e0 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73 65 20  nction that use 
101f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 6f 20  this routine so 
10200 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
10210 6e 73 20 77 69 6c 6c 20 65 78 69 73 74 0a 2a 2a  ns will exist.**
10220 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75   for name resolu
10230 74 69 6f 6e 20 62 75 74 20 61 72 65 20 61 63 74  tion but are act
10240 75 61 6c 6c 79 20 6f 76 65 72 6c 6f 61 64 65 64  ually overloaded
10250 20 62 79 20 74 68 65 20 78 46 69 6e 64 46 75 6e   by the xFindFun
10260 63 74 69 6f 6e 0a 2a 2a 20 6d 65 74 68 6f 64 20  ction.** method 
10270 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  of virtual table
10280 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10290 64 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64  d sqlite3Invalid
102a0 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
102b0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
102c0 74 65 78 74 2c 20 20 2f 2a 20 54 68 65 20 66 75  text,  /* The fu
102d0 6e 63 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 63  nction calling c
102e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
102f0 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20  NotUsed,        
10300 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10310 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
10320 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
10330 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
10340 20 2a 2a 4e 6f 74 55 73 65 64 32 20 20 20 2f 2a   **NotUsed2   /*
10350 20 56 61 6c 75 65 20 6f 66 20 65 61 63 68 20 61   Value of each a
10360 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
10370 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
10380 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
10390 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
103a0 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63  ta(context);.  c
103b0 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
103c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
103d0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
103e0 29 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  );.  zErr = sqli
103f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
10400 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73     "unable to us
10410 65 20 66 75 6e 63 74 69 6f 6e 20 25 73 20 69 6e  e function %s in
10420 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
10430 6f 6e 74 65 78 74 22 2c 20 7a 4e 61 6d 65 29 3b  ontext", zName);
10440 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
10450 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
10460 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 73 71   zErr, -1);.  sq
10470 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
10480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  ;.}../*.** Decla
10490 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69  re that a functi
104a0 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
104b0 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74  loaded by a virt
104c0 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
104d0 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
104e0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
104f0 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f  as a regular glo
10500 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  bal function, th
10510 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
10520 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
10530 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
10540 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
10550 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61  then create.** a
10560 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c   new one that al
10570 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75  ways throws a ru
10580 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a  n-time error.  .
10590 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75  **.** When virtu
105a0 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64  al tables intend
105b0 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f   to provide an o
105c0 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69  verloaded functi
105d0 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75  on, they.** shou
105e0 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ld call this rou
105f0 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  tine to make sur
10600 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  e the global fun
10610 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a  ction exists..**
10620 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69   A global functi
10630 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e  on must exist in
10640 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20   order for name 
10650 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f  resolution to wo
10660 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a  rk.** properly..
10670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
10680 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
10690 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
106a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
106b0 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
106c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
106d0 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a 0a 23 69  char *zCopy;..#i
106e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
106f0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
10700 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10710 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
10720 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67  zName==0 || nArg
10730 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <-2 ){.    retur
10740 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
10750 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
10760 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10770 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
10780 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
10790 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
107a0 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , zName, nArg, S
107b0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 21 3d  QLITE_UTF8, 0)!=
107c0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
107d0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
107e0 65 78 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ex);.  if( rc ) 
107f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10800 3b 0a 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69  ;.  zCopy = sqli
10810 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 4e 61 6d  te3_mprintf(zNam
10820 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 70 79 3d  e);.  if( zCopy=
10830 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
10840 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 65 74 75  TE_NOMEM;.  retu
10850 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
10860 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
10870 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , zName, nArg, S
10880 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20  QLITE_UTF8,.    
10890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108a0 20 20 20 20 20 20 20 7a 43 6f 70 79 2c 20 73 71         zCopy, sq
108b0 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
108c0 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 73 71 6c 69  tion, 0, 0, sqli
108d0 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a 23 69  te3_free);.}..#i
108e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
108f0 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
10900 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
10910 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
10920 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
10930 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
10940 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
10950 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
10960 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
10970 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
10980 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
10990 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
109a0 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
109b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
109c0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
109d0 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
109e0 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
109f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
10a00 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10a10 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
10a20 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  D.void *sqlite3_
10a30 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64  trace(sqlite3 *d
10a40 62 2c 20 76 6f 69 64 28 2a 78 54 72 61 63 65 29  b, void(*xTrace)
10a50 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
10a60 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
10a70 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
10a80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10a90 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
10aa0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
10ab0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
10ac0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
10ad0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
10af0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
10b00 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10b10 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
10b20 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41  ld = db->pTraceA
10b30 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65  rg;.  db->mTrace
10b40 20 3d 20 78 54 72 61 63 65 20 3f 20 53 51 4c 49   = xTrace ? SQLI
10b50 54 45 5f 54 52 41 43 45 5f 4c 45 47 41 43 59 20  TE_TRACE_LEGACY 
10b60 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  : 0;.  db->xTrac
10b70 65 20 3d 20 28 69 6e 74 28 2a 29 28 75 33 32 2c  e = (int(*)(u32,
10b80 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64  void*,void*,void
10b90 2a 29 29 78 54 72 61 63 65 3b 0a 20 20 64 62 2d  *))xTrace;.  db-
10ba0 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
10bb0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
10bc0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
10bd0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
10be0 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ld;.}.#endif /* 
10bf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
10c00 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a 20 52 65  ECATED */../* Re
10c10 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 63  gister a trace c
10c20 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68  allback using th
10c30 65 20 76 65 72 73 69 6f 6e 2d 32 20 69 6e 74 65  e version-2 inte
10c40 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rface..*/.int sq
10c50 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28 0a  lite3_trace_v2(.
10c60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c90 54 72 61 63 65 20 74 68 69 73 20 63 6f 6e 6e 65  Trace this conne
10ca0 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  ction */.  unsig
10cb0 6e 65 64 20 6d 54 72 61 63 65 2c 20 20 20 20 20  ned mTrace,     
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
10ce0 20 65 76 65 6e 74 73 20 74 6f 20 62 65 20 74 72   events to be tr
10cf0 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  aced */.  int(*x
10d00 54 72 61 63 65 29 28 75 6e 73 69 67 6e 65 64 2c  Trace)(unsigned,
10d10 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64  void*,void*,void
10d20 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  *),  /* Callback
10d30 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20   to invoke */.  
10d40 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10d70 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23 69 66 64  ntext */.){.#ifd
10d80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10d90 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
10da0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
10db0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
10dc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10dd0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
10de0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10df0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10e00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
10e10 6d 54 72 61 63 65 3d 3d 30 20 29 20 78 54 72 61  mTrace==0 ) xTra
10e20 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 54  ce = 0;.  if( xT
10e30 72 61 63 65 3d 3d 30 20 29 20 6d 54 72 61 63 65  race==0 ) mTrace
10e40 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 54 72 61   = 0;.  db->mTra
10e50 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a 20 20 64  ce = mTrace;.  d
10e60 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61  b->xTrace = xTra
10e70 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65  ce;.  db->pTrace
10e80 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
10e90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10ea0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
10eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10ec0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10ed0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
10ee0 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  TED./*.** Regist
10ef0 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e  er a profile fun
10f00 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
10f10 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
10f20 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
10f30 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  .** profile func
10f40 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
10f50 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
10f60 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
10f70 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
10f80 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65  profiling is exe
10f90 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
10fa0 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73  LL.** profile is
10fb0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
10fc0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
10fd0 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
10fe0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a  conclusion of.**
10ff0 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
11000 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e  ent that is run.
11010 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
11020 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c  3_profile(.  sql
11030 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
11040 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69   (*xProfile)(voi
11050 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  d*,const char*,s
11060 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20  qlite_uint64),. 
11070 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
11080 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69   void *pOld;..#i
11090 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
110a0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
110b0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
110c0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
110d0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
110e0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
110f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11100 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
11110 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
11120 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
11130 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
11140 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
11150 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
11160 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
11170 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54  = pArg;.  db->mT
11180 72 61 63 65 20 26 3d 20 53 51 4c 49 54 45 5f 54  race &= SQLITE_T
11190 52 41 43 45 5f 4e 4f 4e 4c 45 47 41 43 59 5f 4d  RACE_NONLEGACY_M
111a0 41 53 4b 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78  ASK;.  if( db->x
111b0 50 72 6f 66 69 6c 65 20 29 20 64 62 2d 3e 6d 54  Profile ) db->mT
111c0 72 61 63 65 20 7c 3d 20 53 51 4c 49 54 45 5f 54  race |= SQLITE_T
111d0 52 41 43 45 5f 58 50 52 4f 46 49 4c 45 3b 0a 20  RACE_XPROFILE;. 
111e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
111f0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
11200 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
11210 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11220 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
11230 45 44 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ED */.#endif /* 
11240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
11250 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  E */../*.** Regi
11260 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  ster a function 
11270 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68  to be invoked wh
11280 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
11290 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20   commits..** If 
112a0 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63  the invoked func
112b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tion returns non
112c0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
112d0 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61  commit becomes a
112e0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  .** rollback..*/
112f0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63  .void *sqlite3_c
11300 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71  ommit_hook(.  sq
11310 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
11320 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
11330 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
11340 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
11350 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
11360 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75  )(void*),  /* Fu
11370 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65  nction to invoke
11380 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20   on each commit 
11390 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
113b0 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
113c0 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
113d0 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a  .  void *pOld;..
113e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
113f0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
11400 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
11410 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
11420 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
11430 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
11440 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11450 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
11460 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
11470 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
11480 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  d = db->pCommitA
11490 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69  rg;.  db->xCommi
114a0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  tCallback = xCal
114b0 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f  lback;.  db->pCo
114c0 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a  mmitArg = pArg;.
114d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
114e0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
114f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
11500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
11510 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
11520 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
11530 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
11540 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
11550 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
11560 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
11570 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
11580 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
11590 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73  update_hook(.  s
115a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
115b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
115c0 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
115d0 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
115e0 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
115f0 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
11600 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20  ar const *,char 
11610 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69  const *,sqlite_i
11620 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
11630 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
11640 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
11650 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
11660 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
11670 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
11680 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
11690 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
116a0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
116b0 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
116c0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
116d0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
116e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
116f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
11700 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
11710 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64   pRet = db->pUpd
11720 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55  ateArg;.  db->xU
11730 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20  pdateCallback = 
11740 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
11750 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  >pUpdateArg = pA
11760 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11770 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11780 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11790 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
117a0 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
117b0 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
117c0 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
117d0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
117e0 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69  d.** back by thi
117f0 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
11800 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
11810 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
11820 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
11830 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
11840 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
11850 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
11860 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
11870 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
11880 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63  id*), /* Callbac
11890 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
118a0 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
118b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
118c0 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
118d0 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
118e0 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65  id *pRet;..#ifde
118f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11900 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
11910 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
11920 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
11930 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
11940 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
11950 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
11960 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
11970 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
11980 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
11990 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b  b->pRollbackArg;
119a0 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  .  db->xRollback
119b0 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
119c0 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c  back;.  db->pRol
119d0 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b  lbackArg = pArg;
119e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
119f0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
11a00 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
11a10 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
11a20 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
11a30 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52  ATE_HOOK./*.** R
11a40 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
11a50 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
11a60 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
11a70 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
11a80 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
11a90 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
11aa0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11ab0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
11ac0 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68  ite3_preupdate_h
11ad0 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
11ae0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
11af0 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
11b00 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
11b10 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a  base */.  void(*
11b20 78 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20 20  xCallback)(     
11b30 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
11b40 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
11b50 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
11b60 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63  nt,char const*,c
11b70 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74  har const*,sqlit
11b80 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65 33  e3_int64,sqlite3
11b90 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
11ba0 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
11bb0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 61       /* First ca
11bc0 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20  llback argument 
11bd0 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
11be0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
11bf0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
11c00 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
11c10 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
11c20 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
11c30 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  teCallback = xCa
11c40 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50  llback;.  db->pP
11c50 72 65 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  reUpdateArg = pA
11c60 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11c70 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11c80 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11c90 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
11ca0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
11cb0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
11cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11cd0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
11ce0 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
11cf0 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
11d00 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71  registered by sq
11d10 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
11d20 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49  eckpoint()..** I
11d30 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61  nvoke sqlite3_wa
11d40 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  l_checkpoint if 
11d50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
11d60 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
11d70 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
11d80 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e  er than sqlite3.
11d90 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20  pWalArg cast to 
11da0 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20  an integer (the 
11db0 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
11dc0 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63   by.** wal_autoc
11dd0 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  heckpoint())..*/
11de0 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c   .int sqlite3Wal
11df0 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76  DefaultHook(.  v
11e00 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
11e10 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  ,     /* Argumen
11e20 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
11e30 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db,           /*
11e40 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   Connection */. 
11e50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
11e60 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
11e70 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ase */.  int nFr
11e80 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
11e90 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a  /* Size of WAL *
11ea0 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d  /.){.  if( nFram
11eb0 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  e>=SQLITE_PTR_TO
11ec0 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61  _INT(pClientData
11ed0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11ee0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
11ef0 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
11f00 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
11f10 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71  db, zDb);.    sq
11f20 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
11f30 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65  lloc();.  }.  re
11f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11f50 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11f60 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
11f70 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
11f80 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  an sqlite3_wal_h
11f90 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74  ook() callback t
11fa0 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
11fb0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20  checkpoint.** a 
11fc0 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63  database after c
11fd0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
11fe0 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
11ff0 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a   are nFrame or.*
12000 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e  * more frames in
12010 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50   the log file. P
12020 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61  assing zero or a
12030 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
12040 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65  as the.** nFrame
12050 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62   parameter disab
12060 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68  les automatic ch
12070 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65  eckpoints entire
12080 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ly..**.** The ca
12090 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
120a0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
120b0 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20  on replaces any 
120c0 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63  existing callbac
120d0 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20  k.** registered 
120e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
120f0 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69  l_hook(). Likewi
12100 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20  se, registering 
12110 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73  a callback.** us
12120 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
12130 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20  hook() disables 
12140 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68  the automatic ch
12150 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69  eckpoint mechani
12160 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  sm.** configured
12170 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
12180 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
12190 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
121a0 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
121b0 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23  , int nFrame){.#
121c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
121d0 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50  T_WAL.  UNUSED_P
121e0 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
121f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12200 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a  (nFrame);.#else.
12210 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12220 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
12230 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
12240 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
12250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
12260 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
12270 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  if.  if( nFrame>
12280 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12290 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71  _wal_hook(db, sq
122a0 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
122b0 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ook, SQLITE_INT_
122c0 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b  TO_PTR(nFrame));
122d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
122e0 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
122f0 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  b, 0, 0);.  }.#e
12300 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
12310 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12320 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
12330 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
12340 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
12350 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77  transaction is w
12360 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74  ritten.** into t
12370 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c  he write-ahead-l
12380 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62  og by this datab
12390 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
123a0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
123b0 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  _wal_hook(.  sql
123c0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
123e0 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
123f0 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c  to this db handl
12400 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c  e */.  int(*xCal
12410 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73  lback)(void *, s
12420 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
12430 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f  har*, int),.  vo
12440 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12460 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
12470 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62  passed to xCallb
12480 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ack() */.){.#ifn
12490 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
124a0 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  WAL.  void *pRet
124b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
124c0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
124d0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
124e0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
124f0 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
12500 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12510 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
12520 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
12530 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12540 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
12550 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72  Ret = db->pWalAr
12560 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c  g;.  db->xWalCal
12570 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
12580 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67  k;.  db->pWalArg
12590 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
125a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
125b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
125c0 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a  urn pRet;.#else.
125d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
125e0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
125f0 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
12600 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zDb..*/.int sqli
12610 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
12620 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  nt_v2(.  sqlite3
12630 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
12640 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
12650 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
12660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
12670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12680 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61   /* Name of atta
12690 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f  ched database (o
126a0 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
126b0 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20   eMode,         
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
126d0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
126e0 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  T_* value */.  i
126f0 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20  nt *pnLog,      
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12710 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57  * OUT: Size of W
12720 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73  AL log in frames
12730 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70   */.  int *pnCkp
12740 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
12750 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
12760 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  tal number of fr
12770 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65  ames checkpointe
12780 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  d */.){.#ifdef S
12790 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
127a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
127b0 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  K;.#else.  int r
127c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
127d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
127e0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
127f0 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f  nt iDb = SQLITE_
12800 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f  MAX_ATTACHED;  /
12810 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20  * sqlite3.aDb[] 
12820 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63  index of db to c
12830 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69  heckpoint */..#i
12840 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12850 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
12860 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
12870 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
12880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
12890 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
128a0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
128b0 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  e the output var
128c0 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20  iables to -1 in 
128d0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
128e0 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70  curs. */.  if( p
128f0 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20  nLog ) *pnLog = 
12900 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74  -1;.  if( pnCkpt
12910 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b   ) *pnCkpt = -1;
12920 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
12930 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
12940 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73  SSIVE==0 );.  as
12950 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
12960 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20  CKPOINT_FULL==1 
12970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
12980 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
12990 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61  ESTART==2 );.  a
129a0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
129b0 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
129c0 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65 4d  E==3 );.  if( eM
129d0 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode<SQLITE_CHECK
129e0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c  POINT_PASSIVE ||
129f0 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48   eMode>SQLITE_CH
12a00 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
12a10 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  E ){.    /* EVID
12a20 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36  ENCE-OF: R-03996
12a30 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70 61 72  -12088 The M par
12a40 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61  ameter must be a
12a50 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e   valid checkpoin
12a60 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a  t.    ** mode: *
12a70 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
12a80 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
12a90 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12aa0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
12ab0 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20  );.  if( zDb && 
12ac0 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44  zDb[0] ){.    iD
12ad0 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
12ae0 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
12af0 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20    }.  if( iDb<0 
12b00 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12b10 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
12b20 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
12b30 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52  g(db, SQLITE_ERR
12b40 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  OR, "unknown dat
12b50 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29  abase: %s", zDb)
12b60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
12b70 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
12b80 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  Busy = 0;.    rc
12b90 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
12ba0 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
12bb0 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
12bc0 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
12bd0 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
12be0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
12bf0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
12c00 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
12c10 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
12c20 74 61 74 65 6d 65 6e 74 73 2c 20 63 6c 65 61 72  tatements, clear
12c30 20 74 68 65 20 69 6e 74 65 72 72 75 70 74 20 66   the interrupt f
12c40 6c 61 67 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  lag at this.  **
12c50 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 69 66   point.  */.  if
12c60 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
12c70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  e==0 ){.    db->
12c80 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
12c90 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c   = 0;.  }..  sql
12ca0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12cb0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
12cc0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
12cd0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
12ce0 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
12cf0 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55  Db. If zDb is NU
12d00 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75  LL, or if the bu
12d10 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a  ffer zDb points.
12d20 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61  ** to contains a
12d30 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72   zero-length str
12d40 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65  ing, all attache
12d50 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  d databases are 
12d60 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
12d70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12d80 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
12d90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
12da0 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
12db0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
12dc0 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54   R-41613-20553 T
12dd0 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  he sqlite3_wal_c
12de0 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69  heckpoint(D,X) i
12df0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
12e00 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c    ** sqlite3_wal
12e10 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44  _checkpoint_v2(D
12e20 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  ,X,SQLITE_CHECKP
12e30 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30  OINT_PASSIVE,0,0
12e40 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ). */.  return s
12e50 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
12e60 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c  point_v2(db,zDb,
12e70 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
12e80 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a  T_PASSIVE,0,0);.
12e90 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12ea0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
12eb0 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   Run a checkpoin
12ec0 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44  t on database iD
12ed0 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  b. This is a no-
12ee0 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69  op if database i
12ef0 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72  Db is.** not cur
12f00 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57  rently open in W
12f10 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  AL mode..**.** I
12f20 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
12f30 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  is open on the d
12f40 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68  atabase being ch
12f50 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73  eckpointed, this
12f60 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
12f70 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
12f80 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70  KED and a checkp
12f90 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65  oint is not atte
12fa0 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e  mpted. If .** an
12fb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
12fc0 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ile running the 
12fd0 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53  checkpoint, an S
12fe0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
12ff0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
13000 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f   (i.e. SQLITE_IO
13010 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  ERR). Otherwise,
13020 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
13030 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  * The mutex on d
13040 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
13050 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  b should be held
13060 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
13070 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73  The mutex.** ass
13080 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
13090 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65   specific b-tree
130a0 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
130b0 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a  ted is taken by.
130c0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
130d0 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b   while the check
130e0 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67  point is running
130f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69  ..**.** If iDb i
13100 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f  s passed SQLITE_
13110 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68  MAX_ATTACHED, th
13120 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  en all attached 
13130 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a  databases are.**
13140 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49   checkpointed. I
13150 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
13160 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
13170 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
13180 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74  tely -.** no att
13190 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
131a0 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72  checkpoint any r
131b0 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73  emaining databas
131c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  es..**.** Parame
131d0 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65  ter eMode is one
131e0 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   of SQLITE_CHECK
131f0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46  POINT_PASSIVE, F
13200 55 4c 4c 2c 20 52 45 53 54 41 52 54 0a 2a 2a 20  ULL, RESTART.** 
13210 6f 72 20 54 52 55 4e 43 41 54 45 2e 0a 2a 2f 0a  or TRUNCATE..*/.
13220 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
13230 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
13240 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
13250 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f  eMode, int *pnLo
13260 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b  g, int *pnCkpt){
13270 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13280 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
13290 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
132a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
132d0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
132e0 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a  h attached dbs *
132f0 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20  /.  int bBusy = 
13300 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13310 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53      /* True if S
13320 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62  QLITE_BUSY has b
13330 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  een encountered 
13340 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
13350 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13360 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
13370 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20   assert( !pnLog 
13380 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b  || *pnLog==-1 );
13390 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b  .  assert( !pnCk
133a0 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d  pt || *pnCkpt==-
133b0 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  1 );..  for(i=0;
133c0 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63   i<db->nDb && rc
133d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
133e0 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44  ){.    if( i==iD
133f0 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45  b || iDb==SQLITE
13400 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b  _MAX_ATTACHED ){
13410 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13420 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69  te3BtreeCheckpoi
13430 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  nt(db->aDb[i].pB
13440 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  t, eMode, pnLog,
13450 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20   pnCkpt);.      
13460 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20  pnLog = 0;.     
13470 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20   pnCkpt = 0;.   
13480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13490 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
134a0 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20    bBusy = 1;.   
134b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
134c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
134d0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
134e0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
134f0 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49  && bBusy) ? SQLI
13500 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a  TE_BUSY : rc;.}.
13510 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13520 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
13530 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13540 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
13550 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68  f main-memory sh
13560 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73  ould be used ins
13570 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d  tead of.** a tem
13580 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20  porary file for 
13590 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20  transient pager 
135a0 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d  files and statem
135b0 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ent journals..**
135c0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
135d0 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ned depends on t
135e0 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e  he value of db->
135f0 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74  temp_store (runt
13600 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ime.** parameter
13610 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  ) and the compil
13620 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20  e time value of 
13630 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
13640 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  E. The.** follow
13650 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
13660 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  bes the relation
13670 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65  ship between the
13680 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  se two values.**
13690 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
136a0 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ons return value
136b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
136c0 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20  _TEMP_STORE     
136d0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20  db->temp_store  
136e0 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74     Location of t
136f0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
13700 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
13710 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
13720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
13730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
13750 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
13760 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
13780 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
13790 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137c0 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
137d0 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
13800 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
13810 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20  turn 1).**   1  
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13840 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
13850 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
13860 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
13870 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
13880 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
13890 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
138a0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
138b0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
138c0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
138d0 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
138e0 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
138f0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
13910 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
13920 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20   1).**   3      
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
13940 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
13950 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
13960 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71  urn 1).*/.int sq
13970 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
13980 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20  y(const sqlite3 
13990 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *db){.#if SQLITE
139a0 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20  _TEMP_STORE==1. 
139b0 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
139c0 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23  mp_store==2 );.#
139d0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
139e0 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20  _TEMP_STORE==2. 
139f0 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
13a00 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23  mp_store!=1 );.#
13a10 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13a20 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20  _TEMP_STORE==3. 
13a30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13a40 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(db);.  return 
13a50 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  1;.#endif.#if SQ
13a60 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c  LITE_TEMP_STORE<
13a70 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50  1 || SQLITE_TEMP
13a80 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53 45  _STORE>3.  UNUSE
13a90 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
13aa0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
13ab0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
13ac0 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  urn UTF-8 encode
13ad0 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
13ae0 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
13af0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
13b00 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
13b10 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
13b20 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65  e3_errmsg(sqlite
13b30 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20  3 *db){.  const 
13b40 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21  char *z;.  if( !
13b50 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
13b60 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
13b70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13b80 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
13b90 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
13ba0 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
13bb0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
13bc0 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
13bd0 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
13be0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
13bf0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
13c00 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
13c10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
13c20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
13c30 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
13c40 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b  _BKPT);.  }else{
13c50 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64  .    testcase( d
13c60 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20  b->pErr==0 );.  
13c70 20 20 7a 20 3d 20 64 62 2d 3e 65 72 72 43 6f 64    z = db->errCod
13c80 65 20 3f 20 28 63 68 61 72 2a 29 73 71 6c 69 74  e ? (char*)sqlit
13c90 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62  e3_value_text(db
13ca0 2d 3e 70 45 72 72 29 20 3a 20 30 3b 0a 20 20 20  ->pErr) : 0;.   
13cb0 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
13cc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
13cd0 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
13ce0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
13cf0 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
13d00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
13d10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13d20 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
13d30 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
13d40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13d50 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
13d60 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63  eturn UTF-16 enc
13d70 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
13d80 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
13d90 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
13da0 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
13db0 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
13dc0 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73  lite3_errmsg16(s
13dd0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
13de0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
13df0 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20  outOfMem[] = {. 
13e00 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
13e10 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c  , ' ', 'o', 'f',
13e20 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20   ' ', 'm', 'e', 
13e30 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27  'm', 'o', 'r', '
13e40 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61  y', 0.  };.  sta
13e50 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69  tic const u16 mi
13e60 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  suse[] = {.    '
13e70 62 27 2c 20 27 61 27 2c 20 27 64 27 2c 20 27 20  b', 'a', 'd', ' 
13e80 27 2c 20 27 70 27 2c 20 27 61 27 2c 20 27 72 27  ', 'p', 'a', 'r'
13e90 2c 20 27 61 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , 'a', 'm', 'e',
13ea0 20 27 74 27 2c 20 27 65 27 2c 20 27 72 27 2c 20   't', 'e', 'r', 
13eb0 27 20 27 2c 0a 20 20 20 20 27 6f 27 2c 20 27 72  ' ',.    'o', 'r
13ec0 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 74 27  ', ' ', 'o', 't'
13ed0 2c 20 27 68 27 2c 20 27 65 27 2c 20 27 72 27 2c  , 'h', 'e', 'r',
13ee0 20 27 20 27 2c 20 27 41 27 2c 20 27 50 27 2c 20   ' ', 'A', 'P', 
13ef0 27 49 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6d  'I', ' ',.    'm
13f00 27 2c 20 27 69 27 2c 20 27 73 27 2c 20 27 75 27  ', 'i', 's', 'u'
13f10 2c 20 27 73 27 2c 20 27 65 27 2c 20 30 0a 20 20  , 's', 'e', 0.  
13f20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  };..  const void
13f30 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
13f40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
13f50 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
13f60 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
13f70 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
13f80 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
13f90 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d  return (void *)m
13fa0 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  isuse;.  }.  sql
13fb0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13fc0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
13fd0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
13fe0 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28  led ){.    z = (
13ff0 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
14000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
14010 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
14020 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
14030 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
14040 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14050 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
14060 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c  db->errCode, sql
14070 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
14080 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  rrCode));.      
14090 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
140a0 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
140b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  r);.    }.    /*
140c0 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
140d0 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
140e0 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
140f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14100 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  t16().    ** abo
14110 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ve. If this is t
14120 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
14130 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
14140 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f  ed flag needs to
14150 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72  .    ** be clear
14160 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
14170 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72  ing. Do this dir
14180 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
14190 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c  f via.    ** sql
141a0 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74  ite3ApiExit(), t
141b0 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20  o avoid setting 
141c0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
141d0 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  dle error messag
141e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
141f0 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72 28 64 62  lite3OomClear(db
14200 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14210 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
14220 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
14230 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
14240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
14250 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  16 */../*.** Ret
14260 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
14270 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67  ent error code g
14280 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53  enerated by an S
14290 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49  QLite routine. I
142a0 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73  f NULL is.** pas
142b0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
142c0 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20  tion, we assume 
142d0 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  a malloc() faile
142e0 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  d during sqlite3
142f0 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _open()..*/.int 
14300 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
14310 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
14320 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
14330 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
14340 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
14350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
14360 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
14370 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
14380 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
14390 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
143a0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
143b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
143c0 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72  errCode & db->er
143d0 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rMask;.}.int sql
143e0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
143f0 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
14400 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
14410 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
14420 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
14430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14440 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
14450 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
14460 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
14470 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
14480 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
14490 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
144a0 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  n db->errCode;.}
144b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 73  .int sqlite3_sys
144c0 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c 69 74 65  tem_errno(sqlite
144d0 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
144e0 20 64 62 20 3f 20 64 62 2d 3e 69 53 79 73 45 72   db ? db->iSysEr
144f0 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a 2f 2a  rno : 0;.}  ../*
14500 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
14510 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
14520 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
14530 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
14540 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
14550 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69  t.  For now, thi
14560 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74  s simply calls t
14570 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69  he internal sqli
14580 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66  te3ErrStr().** f
14590 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  unction..*/.cons
145a0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
145b0 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a  errstr(int rc){.
145c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
145d0 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f  ErrStr(rc);.}../
145e0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
145f0 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  w collating func
14600 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73  tion for databas
14610 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d  e "db".  The nam
14620 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e  e is zName.** an
14630 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  d the encoding i
14640 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  s enc..*/.static
14650 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61   int createColla
14660 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
14670 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   db,.  const cha
14680 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20  r *zName, .  u8 
14690 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74  enc,.  void* pCt
146a0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
146b0 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
146c0 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
146d0 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
146e0 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
146f0 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
14700 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32  Coll;.  int enc2
14710 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
14720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14730 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
14740 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
14750 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
14760 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
14770 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
14780 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
14790 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
147a0 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
147b0 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
147c0 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
147d0 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
147e0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
147f0 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
14800 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63  ally..  */.  enc
14810 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63  2 = enc;.  testc
14820 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
14830 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73  E_UTF16 );.  tes
14840 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
14850 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
14860 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  D );.  if( enc2=
14870 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c  =SQLITE_UTF16 ||
14880 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
14890 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20  F16_ALIGNED ){. 
148a0 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45     enc2 = SQLITE
148b0 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
148c0 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c  }.  if( enc2<SQL
148d0 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32  ITE_UTF8 || enc2
148e0 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  >SQLITE_UTF16BE 
148f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14900 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
14910 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
14920 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
14930 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
14940 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
14950 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
14960 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
14970 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
14980 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
14990 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
149a0 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
149b0 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
149c0 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
149d0 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
149e0 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
149f0 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
14a00 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
14a10 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  nc2, zName, 0);.
14a20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
14a30 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
14a40 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
14a50 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
14a60 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
14a70 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
14a80 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
14a90 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
14aa0 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
14ab0 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
14ac0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
14ad0 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
14ae0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
14af0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14b00 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
14b10 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b  atements(db, 0);
14b20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c  ..    /* If coll
14b30 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
14b40 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64  Coll was created
14b50 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63   directly by a c
14b60 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
14b70 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
14b80 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20  lation, and not 
14b90 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e  generated by syn
14ba0 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20  thCollSeq(),.   
14bb0 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70   ** then any cop
14bc0 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74  ies made by synt
14bd0 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20  hCollSeq() need 
14be0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
14bf0 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  d..    ** Also, 
14c00 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75  collation destru
14c10 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78  ctor - CollSeq.x
14c20 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e  Del() - function
14c30 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
14c40 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20   to be called.. 
14c50 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28     */ .    if( (
14c60 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51  pColl->enc & ~SQ
14c70 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
14c80 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20  ED)==enc2 ){.   
14c90 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c     CollSeq *aCol
14ca0 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
14cb0 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
14cc0 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  q, zName);.     
14cd0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
14ce0 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
14cf0 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
14d00 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d  q *p = &aColl[j]
14d10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
14d20 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
14d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
14d40 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20  ( p->xDel ){.   
14d50 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c           p->xDel
14d60 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20  (p->pUser);.    
14d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14d80 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20    p->xCmp = 0;. 
14d90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14da0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
14db0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
14dc0 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
14dd0 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29  )enc2, zName, 1)
14de0 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
14df0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14e00 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70  _NOMEM_BKPT;.  p
14e10 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f  Coll->xCmp = xCo
14e20 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  mpare;.  pColl->
14e30 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20  pUser = pCtx;.  
14e40 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44  pColl->xDel = xD
14e50 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63  el;.  pColl->enc
14e60 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28   = (u8)(enc2 | (
14e70 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46  enc & SQLITE_UTF
14e80 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20  16_ALIGNED));.  
14e90 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
14ea0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72   SQLITE_OK);.  r
14eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14ec0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
14ed0 61 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61  array defines ha
14ee0 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20  rd upper bounds 
14ef0 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e  on limit values.
14f00 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c    The.** initial
14f10 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70  izer must be kep
14f20 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74  t in sync with t
14f30 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
14f40 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e  *.** #defines in
14f50 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73   sqlite3.h..*/.s
14f60 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
14f70 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b  aHardLimit[] = {
14f80 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  .  SQLITE_MAX_LE
14f90 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
14fa0 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20  AX_SQL_LENGTH,. 
14fb0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
14fc0 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  MN,.  SQLITE_MAX
14fd0 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53  _EXPR_DEPTH,.  S
14fe0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
14ff0 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c  ND_SELECT,.  SQL
15000 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c  ITE_MAX_VDBE_OP,
15010 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  .  SQLITE_MAX_FU
15020 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51  NCTION_ARG,.  SQ
15030 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
15040 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  D,.  SQLITE_MAX_
15050 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
15060 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
15070 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
15080 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  R,      /* IMP: 
15090 52 2d 33 38 30 39 31 2d 33 32 33 35 32 20 2a 2f  R-38091-32352 */
150a0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  .  SQLITE_MAX_TR
150b0 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 20 20 53  IGGER_DEPTH,.  S
150c0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
150d0 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a  _THREADS,.};../*
150e0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
150f0 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
15100 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
15110 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
15120 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
15130 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
15140 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
15150 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
15160 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
15170 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
15180 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
15190 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
151a0 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
151b0 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
151c0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
151d0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
151e0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
151f0 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
15200 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
15210 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
15220 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
15230 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
15240 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
15250 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15260 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
15270 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
15280 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
15290 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
152a0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
152b0 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
152c0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
152d0 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
152e0 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
152f0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
15300 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
15310 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
15320 54 49 4f 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65  TION_ARG>127.# e
15330 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
15340 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73  FUNCTION_ARG mus
15350 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
15360 6e 64 20 31 32 37 0a 23 65 6e 64 69 66 0a 23 69  nd 127.#endif.#i
15370 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
15380 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54  ACHED<0 || SQLIT
15390 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31  E_MAX_ATTACHED>1
153a0 32 35 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  25.# error SQLIT
153b0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d  E_MAX_ATTACHED m
153c0 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
153d0 20 61 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a   and 125.#endif.
153e0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
153f0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
15400 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
15410 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
15420 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
15430 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
15440 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
15450 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
15460 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
15470 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
15480 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
15490 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
154a0 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
154b0 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  DEPTH<1.# error 
154c0 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
154d0 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65  ER_DEPTH must be
154e0 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
154f0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15500 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
15510 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
15520 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
15530 35 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  50.# error SQLIT
15540 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
15550 45 41 44 53 20 6d 75 73 74 20 62 65 20 62 65 74  EADS must be bet
15560 77 65 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65  ween 0 and 50.#e
15570 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
15580 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
15590 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72   a limit.  Repor
155a0 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e  t the old value.
155b0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69  .** If an invali
155c0 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73  d limit index is
155d0 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72   supplied, repor
155e0 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  t -1..** Make no
155f0 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69   changes but sti
15600 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c  ll report the ol
15610 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a  d value if the.*
15620 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e  * new limit is n
15630 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41  egative..**.** A
15640 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74   new lower limit
15650 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b   does not shrink
15660 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72   existing constr
15670 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65  ucts..** It mere
15680 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20  ly prevents new 
15690 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20  constructs that 
156a0 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74  exceed the limit
156b0 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67  .** from forming
156c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
156d0 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  _limit(sqlite3 *
156e0 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c  db, int limitId,
156f0 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a   int newLimit){.
15700 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a    int oldLimit;.
15710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15720 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
15730 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
15740 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
15750 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
15760 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
15770 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
15780 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15790 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
157a0 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20  30189-54097 For 
157b0 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67  each limit categ
157c0 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  ory SQLITE_LIMIT
157d0 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65  _NAME.  ** there
157e0 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72   is a hard upper
157f0 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f   bound set at co
15800 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20  mpile-time by a 
15810 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20  C preprocessor. 
15820 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64   ** macro called
15830 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45   SQLITE_MAX_NAME
15840 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22  . (The "_LIMIT_"
15850 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20   in the name is 
15860 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20  changed to.  ** 
15870 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20  "_MAX_".).  */. 
15880 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
15890 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
158a0 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
158b0 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
158c0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
158d0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
158e0 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  _SQL_LENGTH]==SQ
158f0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
15900 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
15910 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15920 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
15930 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  ==SQLITE_MAX_COL
15940 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UMN );.  assert(
15950 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15960 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
15970 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
15980 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20  _EXPR_DEPTH );. 
15990 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
159a0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
159b0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
159c0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  ]==SQLITE_MAX_CO
159d0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a  MPOUND_SELECT);.
159e0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
159f0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15a00 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49  T_VDBE_OP]==SQLI
15a10 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29  TE_MAX_VDBE_OP )
15a20 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15a30 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15a40 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
15a50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  ]==SQLITE_MAX_FU
15a60 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20  NCTION_ARG );.  
15a70 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
15a80 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
15a90 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54  ATTACHED]==SQLIT
15aa0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
15ab0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15ac0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15ad0 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
15ae0 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20  _LENGTH]==.     
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
15b20 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
15b30 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  N_LENGTH );.  as
15b40 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
15b50 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
15b60 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d  RIABLE_NUMBER]==
15b70 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
15b80 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61  BLE_NUMBER);.  a
15b90 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15ba0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  t[SQLITE_LIMIT_T
15bb0 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53  RIGGER_DEPTH]==S
15bc0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
15bd0 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
15be0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15bf0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
15c00 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51  KER_THREADS]==SQ
15c10 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
15c20 54 48 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73  THREADS );.  ass
15c30 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ert( SQLITE_LIMI
15c40 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
15c50 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  ==(SQLITE_N_LIMI
15c60 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20  T-1) );...  if( 
15c70 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d  limitId<0 || lim
15c80 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c  itId>=SQLITE_N_L
15c90 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75  IMIT ){.    retu
15ca0 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64  rn -1;.  }.  old
15cb0 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  Limit = db->aLim
15cc0 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69  it[limitId];.  i
15cd0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29  f( newLimit>=0 )
15ce0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
15cf0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32      /* IMP: R-52
15d00 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20  476-28732 */.   
15d10 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48   if( newLimit>aH
15d20 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
15d30 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69  ] ){.      newLi
15d40 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74  mit = aHardLimit
15d50 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49  [limitId];  /* I
15d60 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33  MP: R-51463-2563
15d70 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64  4 */.    }.    d
15d80 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
15d90 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  d] = newLimit;. 
15da0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c   }.  return oldL
15db0 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
15dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
15dd0 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20  : R-53341-35419 
15de0 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  */.}../*.** This
15df0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
15e00 64 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20  d to parse both 
15e10 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49  URIs and non-URI
15e20 20 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65   filenames passe
15e30 64 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72  d by the.** user
15e40 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   to API function
15e50 73 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  s sqlite3_open()
15e60 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e   or sqlite3_open
15e70 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64  _v2(), and for d
15e80 61 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20  atabase.** URIs 
15e90 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72  specified as par
15ea0 74 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74  t of ATTACH stat
15eb0 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ements..**.** Th
15ec0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
15ed0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
15ee0 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
15ef0 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   the VFS to use 
15f00 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f  (or.** a NULL to
15f10 20 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66   signify the def
15f20 61 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65  ault VFS) if the
15f30 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f   URI does not co
15f40 6e 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78  ntain a "vfs=xxx
15f50 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d  ".** query param
15f60 65 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  eter. The second
15f70 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69   argument contai
15f80 6e 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e  ns the URI (or n
15f90 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29  on-URI filename)
15fa0 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e  .** itself. When
15fb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
15fc0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46  s called the *pF
15fd0 6c 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68  lags variable sh
15fe0 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
15ff0 74 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67  the default flag
16000 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61  s to open the da
16010 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69  tabase handle wi
16020 74 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74  th. The value st
16030 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61  ored in.** *pFla
16040 67 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65  gs may be update
16050 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
16060 6e 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69  ng if the URI fi
16070 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  lename contains 
16080 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20  .** "cache=xxx" 
16090 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75  or "mode=xxx" qu
160a0 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  ery parameters..
160b0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
160c0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
160d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  s returned. In t
160e0 68 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20  his case *ppVfs 
160f0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
16100 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68  to.** the VFS th
16110 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
16120 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61  d to open the da
16130 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a  tabase file. *pz
16140 46 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a  File is set to.*
16150 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  * point to a buf
16160 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
16170 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
16180 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20  ile to open. It 
16190 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
161a0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
161b0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
161c0 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74  ually call sqlit
161d0 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c  e3_free() to rel
161e0 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66  ease.** this buf
161f0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  fer..**.** If an
16200 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
16210 68 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  hen an SQLite er
16220 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
16230 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d  rned and *pzErrM
16240 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74  sg.** may be set
16250 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
16260 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
16270 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
16280 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d  uage error .** m
16290 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
162a0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
162b0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
162c0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
162d0 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66  ease.** this buf
162e0 66 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  fer by calling s
162f0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
16300 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72  /.int sqlite3Par
16310 73 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63  seUri(.  const c
16320 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73  har *zDefaultVfs
16330 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20  ,        /* VFS 
16340 74 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66  to use if no "vf
16350 73 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74  s=xxx" query opt
16360 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
16370 68 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20  har *zUri,      
16380 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d           /* Nul-
16390 74 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74  terminated URI t
163a0 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73  o parse */.  uns
163b0 69 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67  igned int *pFlag
163c0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
163d0 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f  IN/OUT: SQLITE_O
163e0 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  PEN_XXX flags */
163f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
16400 2a 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20  *ppVfs,         
16410 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74     /* OUT: VFS t
16420 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72  o use */ .  char
16430 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20   **pzFile,      
16440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16450 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d  UT: Filename com
16460 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f  ponent of URI */
16470 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
16480 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sg              
16490 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
164a0 20 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21   message (if rc!
164b0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29  =SQLITE_OK) */.)
164c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
164d0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e  ITE_OK;.  unsign
164e0 65 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a  ed int flags = *
164f0 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20  pFlags;.  const 
16500 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65  char *zVfs = zDe
16510 66 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72  faultVfs;.  char
16520 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20   *zFile;.  char 
16530 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  c;.  int nUri = 
16540 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16550 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74  zUri);..  assert
16560 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29  ( *pzErrMsg==0 )
16570 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73  ;..  if( ((flags
16580 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
16590 52 49 29 20 20 20 20 20 20 20 20 20 20 20 20 20  RI)             
165a0 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d  /* IMP: R-48725-
165b0 33 32 32 30 36 20 2a 2f 0a 20 20 20 20 20 20 20  32206 */.       
165c0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
165d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65  lobalConfig.bOpe
165e0 6e 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d  nUri) /* IMP: R-
165f0 35 31 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20  51689-46548 */. 
16600 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20    && nUri>=5 && 
16610 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69  memcmp(zUri, "fi
16620 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49  le:", 5)==0 /* I
16630 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39  MP: R-57884-3749
16640 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68  6 */.  ){.    ch
16650 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e  ar *zOpt;.    in
16660 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  t eState;       
16670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16680 61 72 73 65 72 20 73 74 61 74 65 20 77 68 65 6e  arser state when
16690 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a   parsing URI */.
166a0 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20      int iIn;    
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166c0 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61    /* Input chara
166d0 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cter index */.  
166e0 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20    int iOut = 0; 
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61 63  /* Output charac
16710 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ter index */.   
16720 20 75 36 34 20 6e 42 79 74 65 20 3d 20 6e 55 72   u64 nByte = nUr
16730 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f  i+2;           /
16740 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
16750 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
16760 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
16770 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  e the SQLITE_OPE
16780 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73 65  N_URI flag is se
16790 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f  t to indicate to
167a0 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a   the VFS xOpen .
167b0 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68      ** method th
167c0 61 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  at there may be 
167d0 65 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 73  extra parameters
167e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66   following the f
167f0 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20  ile-name.  */.  
16800 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
16810 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20  E_OPEN_URI;..   
16820 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c   for(iIn=0; iIn<
16830 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79  nUri; iIn++) nBy
16840 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d  te += (zUri[iIn]
16850 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c  =='&');.    zFil
16860 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
16870 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20  oc64(nByte);.   
16880 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
16890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
168a0 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49 6e  M_BKPT;..    iIn
168b0 20 3d 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 5;.#ifdef SQL
168c0 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55  ITE_ALLOW_URI_AU
168d0 54 48 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20  THORITY.    if( 
168e0 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20  strncmp(zUri+5, 
168f0 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a  "///", 3)==0 ){.
16900 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20        iIn = 7;. 
16910 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
16920 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20  owing condition 
16930 63 61 75 73 65 73 20 55 52 49 73 20 77 69 74 68  causes URIs with
16940 20 66 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20   five leading / 
16950 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20  characters.     
16960 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f   ** like file://
16970 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20  ///host/path to 
16980 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
16990 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f  o UNCs like //ho
169a0 73 74 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a  st/path..      *
169b0 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20 55 52  * The correct UR
169c0 49 20 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68  I for that UNC h
169d0 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66  as only two or f
169e0 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68  our leading / ch
169f0 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a  aracters.      *
16a00 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61  * file://host/pa
16a10 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68  th or file:////h
16a20 6f 73 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35  ost/path.  But 5
16a30 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73   leading slashes
16a40 20 69 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   is a .      ** 
16a50 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65  common error, we
16a60 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65   are told, so we
16a70 20 68 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20   handle it as a 
16a80 73 70 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f  special case. */
16a90 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
16aa0 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22  mp(zUri+7, "///"
16ab0 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b  , 3)==0 ){ iIn++
16ac0 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ; }.    }else if
16ad0 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35  ( strncmp(zUri+5
16ae0 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22  , "//localhost/"
16af0 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 12)==0 ){.    
16b00 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20    iIn = 16;.    
16b10 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44  }.#else.    /* D
16b20 69 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d  iscard the schem
16b30 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20  e and authority 
16b40 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  segments of the 
16b50 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  URI. */.    if( 
16b60 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20  zUri[5]=='/' && 
16b70 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a  zUri[6]=='/' ){.
16b80 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20        iIn = 7;. 
16b90 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69       while( zUri
16ba0 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49  [iIn] && zUri[iI
16bb0 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b  n]!='/' ) iIn++;
16bc0 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d  .      if( iIn!=
16bd0 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c  7 && (iIn!=16 ||
16be0 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f   memcmp("localho
16bf0 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39  st", &zUri[7], 9
16c00 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  )) ){.        *p
16c10 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
16c20 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c  3_mprintf("inval
16c30 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79  id uri authority
16c40 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20  : %.*s", .      
16c50 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55        iIn-7, &zU
16c60 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20  ri[7]);.        
16c70 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
16c80 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
16c90 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
16ca0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
16cb0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79  dif..    /* Copy
16cc0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
16cd0 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61  d any query para
16ce0 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  meters into the 
16cf0 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20  zFile buffer. . 
16d00 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48     ** Decode %HH
16d10 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c   escape codes al
16d20 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20  ong the way. .  
16d30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68    **.    ** With
16d40 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61  in this loop, va
16d50 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61  riable eState ma
16d60 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31  y be set to 0, 1
16d70 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67   or 2, depending
16d80 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70  .    ** on the p
16d90 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
16da0 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  As follows:.    
16db0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50  **.    **   0: P
16dc0 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65  arsing file-name
16dd0 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61  ..    **   1: Pa
16de0 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69  rsing name secti
16df0 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
16e00 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
16e10 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20  er..    **   2: 
16e20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65  Parsing value se
16e30 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
16e40 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
16e50 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  meter..    */.  
16e60 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20    eState = 0;.  
16e70 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
16e80 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
16e90 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  !='#' ){.      i
16ea0 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
16eb0 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26  c=='%' .       &
16ec0 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69  & sqlite3Isxdigi
16ed0 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20  t(zUri[iIn]) .  
16ee0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
16ef0 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
16f00 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  +1]) .      ){. 
16f10 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74         int octet
16f20 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f   = (sqlite3HexTo
16f30 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29  Int(zUri[iIn++])
16f40 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20   << 4);.        
16f50 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  octet += sqlite3
16f60 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
16f70 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20  n++]);..        
16f80 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30  assert( octet>=0
16f90 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b   && octet<256 );
16fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74  .        if( oct
16fb0 65 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  et==0 ){.#ifndef
16fc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
16fd0 52 49 5f 30 30 5f 45 52 52 4f 52 0a 20 20 20 20  RI_00_ERROR.    
16fe0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
16ff0 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
17000 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73  en "%00" appears
17010 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e   within the URI.
17020 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   In this.       
17030 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67     ** case we ig
17040 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e  nore all text in
17050 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
17060 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65  f the path, name
17070 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   or.          **
17080 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79   value currently
17090 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53   being parsed. S
170a0 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72  o ignore the cur
170b0 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20  rent character. 
170c0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
170d0 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74  skip to the next
170e0 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22   "?", "=" or "&"
170f0 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
17100 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
17110 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
17120 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
17130 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  #' .            
17140 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20    && (eState!=0 
17150 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20  || c!='?').     
17160 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
17170 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d  ate!=1 || (c!='=
17180 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20  ' && c!='&')).  
17190 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
171a0 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d  eState!=2 || c!=
171b0 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29  '&').          )
171c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49  {.            iI
171d0 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
171e0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
171f0 6e 75 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  nue;.#else.     
17200 20 20 20 20 20 2f 2a 20 49 66 20 45 4e 41 42 4c       /* If ENABL
17210 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 20 69  E_URI_00_ERROR i
17220 73 20 64 65 66 69 6e 65 64 2c 20 22 25 30 30 22  s defined, "%00"
17230 20 69 6e 20 61 20 55 52 49 20 69 73 20 61 6e 20   in a URI is an 
17240 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  error. */.      
17250 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
17260 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
17270 22 75 6e 65 78 70 65 63 74 65 64 20 25 25 30 30  "unexpected %%00
17280 20 69 6e 20 75 72 69 22 29 3b 0a 20 20 20 20 20   in uri");.     
17290 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
172a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
172b0 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
172c0 5f 6f 75 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  _out;.#endif.   
172d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
172e0 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20   = octet;.      
172f0 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65  }else if( eState
17300 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c  ==1 && (c=='&' |
17310 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20  | c=='=') ){.   
17320 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69       if( zFile[i
17330 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  Out-1]==0 ){.   
17340 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70         /* An emp
17350 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20  ty option name. 
17360 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69  Ignore this opti
17370 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a  on altogether. *
17380 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  /.          whil
17390 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20  e( zUri[iIn] && 
173a0 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26  zUri[iIn]!='#' &
173b0 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27  & zUri[iIn-1]!='
173c0 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20  &' ) iIn++;.    
173d0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
173e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
173f0 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a    if( c=='&' ){.
17400 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b            zFile[
17410 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
17420 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17430 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20           eState 
17440 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 2;.        }. 
17450 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
17460 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65      }else if( (e
17470 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27  State==0 && c=='
17480 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d  ?') || (eState==
17490 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a  2 && c=='&') ){.
174a0 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
174b0 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
174c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
174d0 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
174e0 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   c;.    }.    if
174f0 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46  ( eState==1 ) zF
17500 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
17510 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
17520 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
17530 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
17540 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20  = '\0';..    /* 
17550 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 77  Check if there w
17560 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20  ere any options 
17570 73 70 65 63 69 66 69 65 64 20 74 68 61 74 20 73  specified that s
17580 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72  hould be interpr
17590 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72  eted .    ** her
175a0 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20  e. Options that 
175b0 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20  are interpreted 
175c0 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66  here include "vf
175d0 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61  s" and those tha
175e0 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70  t.    ** corresp
175f0 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61  ond to flags tha
17600 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20  t may be passed 
17610 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f  to the sqlite3_o
17620 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20  pen_v2().    ** 
17630 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a  method. */.    z
17640 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c  Opt = &zFile[sql
17650 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
17660 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  le)+1];.    whil
17670 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20  e( zOpt[0] ){.  
17680 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73      int nOpt = s
17690 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
176a0 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72  Opt);.      char
176b0 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e   *zVal = &zOpt[n
176c0 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e  Opt+1];.      in
176d0 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
176e0 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a  Strlen30(zVal);.
176f0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d  .      if( nOpt=
17700 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66  =3 && memcmp("vf
17710 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20  s", zOpt, 3)==0 
17720 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20  ){.        zVfs 
17730 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65  = zVal;.      }e
17740 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
17750 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20  uct OpenMode {. 
17760 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
17770 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20  har *z;.        
17780 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20    int mode;.    
17790 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30      } *aMode = 0
177a0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
177b0 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20  zModeType = 0;. 
177c0 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20         int mask 
177d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
177e0 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20   limit = 0;..   
177f0 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35       if( nOpt==5
17800 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68   && memcmp("cach
17810 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20  e", zOpt, 5)==0 
17820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
17830 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d  tic struct OpenM
17840 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d  ode aCacheMode[]
17850 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
17860 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53 51   { "shared",  SQ
17870 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
17880 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20  CACHE },.       
17890 20 20 20 20 20 7b 20 22 70 72 69 76 61 74 65 22       { "private"
178a0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  , SQLITE_OPEN_PR
178b0 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20  IVATECACHE },.  
178c0 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
178d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
178e0 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
178f0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  = SQLITE_OPEN_SH
17900 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45  AREDCACHE|SQLITE
17910 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
17920 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d  HE;.          aM
17930 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65  ode = aCacheMode
17940 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69  ;.          limi
17950 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20  t = mask;.      
17960 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
17970 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20  "cache";.       
17980 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
17990 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70  Opt==4 && memcmp
179a0 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34  ("mode", zOpt, 4
179b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
179c0 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
179d0 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f  OpenMode aOpenMo
179e0 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
179f0 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51       { "ro",  SQ
17a00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
17a10 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  LY },.          
17a20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54    { "rw",  SQLIT
17a30 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
17a40 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   }, .           
17a50 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45   { "rwc", SQLITE
17a60 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
17a70 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
17a80 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  EATE },.        
17a90 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20      { "memory", 
17aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
17ab0 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  RY },.          
17ac0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
17ad0 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
17ae0 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
17af0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c  _OPEN_READONLY |
17b00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17b10 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20  DWRITE.         
17b20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17b30 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
17b40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
17b50 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ORY;.          a
17b60 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65  Mode = aOpenMode
17b70 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69  ;.          limi
17b80 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73  t = mask & flags
17b90 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
17ba0 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73 22  eType = "access"
17bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
17bc0 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29       if( aMode )
17bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
17be0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  i;.          int
17bf0 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20   mode = 0;.     
17c00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d       for(i=0; aM
17c10 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a  ode[i].z; i++){.
17c20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
17c30 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64  t char *z = aMod
17c40 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20  e[i].z;.        
17c50 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71      if( nVal==sq
17c60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
17c70 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56   && 0==memcmp(zV
17c80 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a  al, z, nVal) ){.
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f                mo
17ca0 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f  de = aMode[i].mo
17cb0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  de;.            
17cc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17ce0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
17cf0 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20   mode==0 ){.    
17d00 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
17d10 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17d20 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20  ntf("no such %s 
17d30 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65  mode: %s", zMode
17d40 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
17d50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
17d60 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
17d70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
17d80 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
17d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17da0 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53    if( (mode & ~S
17db0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
17dc0 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  Y)>limit ){.    
17dd0 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
17de0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17df0 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74  ntf("%s mode not
17e00 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20   allowed: %s",. 
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e30 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
17e40 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
17e50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17e60 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20  _PERM;.         
17e70 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
17e80 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
17e90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61   }.          fla
17ea0 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d  gs = (flags & ~m
17eb0 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20  ask) | mode;.   
17ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
17ed0 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56        zOpt = &zV
17ee0 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20  al[nVal+1];.    
17ef0 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
17f00 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
17f10 6d 61 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29  malloc64(nUri+2)
17f20 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65  ;.    if( !zFile
17f30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
17f40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
17f50 20 69 66 28 20 6e 55 72 69 20 29 7b 0a 20 20 20   if( nUri ){.   
17f60 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c     memcpy(zFile,
17f70 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
17f80 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55    }.    zFile[nU
17f90 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ri] = '\0';.    
17fa0 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20  zFile[nUri+1] = 
17fb0 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20  '\0';.    flags 
17fc0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
17fd0 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56  URI;.  }..  *ppV
17fe0 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
17ff0 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69  _find(zVfs);.  i
18000 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a  f( *ppVfs==0 ){.
18010 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
18020 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
18030 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73  "no such vfs: %s
18040 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63  ", zVfs);.    rc
18050 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
18060 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f  .  }. parse_uri_
18070 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
18080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
180a0 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  le);.    zFile =
180b0 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67   0;.  }.  *pFlag
180c0 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a  s = flags;.  *pz
180d0 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20  File = zFile;.  
180e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
180f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
18100 5f 48 41 53 5f 43 4f 44 45 43 29 0a 2f 2a 0a 2a  _HAS_CODEC)./*.*
18110 2a 20 50 72 6f 63 65 73 73 20 55 52 49 20 66 69  * Process URI fi
18120 6c 65 6e 61 6d 65 20 71 75 65 72 79 20 70 61 72  lename query par
18130 61 6d 65 74 65 72 73 20 72 65 6c 65 76 61 6e 74  ameters relevant
18140 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 45   to the SQLite E
18150 6e 63 72 79 70 74 69 6f 6e 0a 2a 2a 20 45 78 74  ncryption.** Ext
18160 65 6e 73 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  ension.  Return 
18170 74 72 75 65 20 69 66 20 61 6e 79 20 6f 66 20 74  true if any of t
18180 68 65 20 72 65 6c 65 76 61 6e 74 20 71 75 65 72  he relevant quer
18190 79 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  y parameters are
181a0 0a 2a 2a 20 73 65 65 6e 20 61 6e 64 20 72 65 74  .** seen and ret
181b0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  urn false if not
181c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
181d0 43 6f 64 65 63 51 75 65 72 79 50 61 72 61 6d 65  CodecQueryParame
181e0 74 65 72 73 28 0a 20 20 73 71 6c 69 74 65 33 20  ters(.  sqlite3 
181f0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
18200 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
18210 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
18220 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
18230 20 20 2f 2a 20 57 68 69 63 68 20 73 63 68 65 6d    /* Which schem
18240 61 20 69 73 20 62 65 69 6e 67 20 63 72 65 61 74  a is being creat
18250 65 64 2f 61 74 74 61 63 68 65 64 20 2a 2f 0a 20  ed/attached */. 
18260 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
18270 69 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 66  i       /* URI f
18280 69 6c 65 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  ilename */.){.  
18290 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
182a0 3b 0a 20 20 69 66 28 20 28 7a 4b 65 79 20 3d 20  ;.  if( (zKey = 
182b0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
182c0 6d 65 74 65 72 28 7a 55 72 69 2c 20 22 68 65 78  meter(zUri, "hex
182d0 6b 65 79 22 29 29 21 3d 30 20 26 26 20 7a 4b 65  key"))!=0 && zKe
182e0 79 5b 30 5d 20 29 7b 0a 20 20 20 20 75 38 20 69  y[0] ){.    u8 i
182f0 42 79 74 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Byte;.    int i;
18300 0a 20 20 20 20 63 68 61 72 20 7a 44 65 63 6f 64  .    char zDecod
18310 65 64 5b 34 30 5d 3b 0a 20 20 20 20 66 6f 72 28  ed[40];.    for(
18320 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c  i=0, iByte=0; i<
18330 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64 65 64 29  sizeof(zDecoded)
18340 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73 78  *2 && sqlite3Isx
18350 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d 29 3b 20  digit(zKey[i]); 
18360 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 42 79 74  i++){.      iByt
18370 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b  e = (iByte<<4) +
18380 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
18390 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20  (zKey[i]);.     
183a0 20 69 66 28 20 28 69 26 31 29 21 3d 30 20 29 20   if( (i&1)!=0 ) 
183b0 7a 44 65 63 6f 64 65 64 5b 69 2f 32 5d 20 3d 20  zDecoded[i/2] = 
183c0 69 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  iByte;.    }.   
183d0 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28   sqlite3_key_v2(
183e0 64 62 2c 20 7a 44 62 2c 20 7a 44 65 63 6f 64 65  db, zDb, zDecode
183f0 64 2c 20 69 2f 32 29 3b 0a 20 20 20 20 72 65 74  d, i/2);.    ret
18400 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  urn 1;.  }else i
18410 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74  f( (zKey = sqlit
18420 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
18430 28 7a 55 72 69 2c 20 22 6b 65 79 22 29 29 21 3d  (zUri, "key"))!=
18440 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
18450 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  _key_v2(db, zDb,
18460 20 7a 4b 65 79 2c 20 73 71 6c 69 74 65 33 53 74   zKey, sqlite3St
18470 72 6c 65 6e 33 30 28 7a 4b 65 79 29 29 3b 0a 20  rlen30(zKey));. 
18480 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
18490 65 6c 73 65 20 69 66 28 20 28 7a 4b 65 79 20 3d  else if( (zKey =
184a0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
184b0 61 6d 65 74 65 72 28 7a 55 72 69 2c 20 22 74 65  ameter(zUri, "te
184c0 78 74 6b 65 79 22 29 29 21 3d 30 20 29 7b 0a 20  xtkey"))!=0 ){. 
184d0 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76     sqlite3_key_v
184e0 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c  2(db, zDb, zKey,
184f0 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
18500 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
18510 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
18520 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
18530 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
18540 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70  s the work of op
18550 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ening a database
18560 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a   on behalf of.**
18570 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
18580 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  and sqlite3_open
18590 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61  16(). The databa
185a0 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69  se filename "zFi
185b0 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20  lename"  .** is 
185c0 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a  UTF-8 encoded..*
185d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
185e0 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e  nDatabase(.  con
185f0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
18600 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20  me, /* Database 
18610 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65  filename UTF-8 e
18620 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  ncoded */.  sqli
18630 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
18640 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
18650 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ned database han
18660 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  dle */.  unsigne
18670 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20  d int flags,    
18680 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66  /* Operational f
18690 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
186a0 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
186b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
186c0 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  VFS to use */.){
186d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f     /* Store allo
18700 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72  cated handle her
18710 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18740 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
18750 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20  sThreadsafe;    
18760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18770 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66  ue for threadsaf
18780 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
18790 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d  .  char *zOpen =
187a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
187b0 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
187c0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
187d0 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a  to BtreeOpen() *
187e0 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  /.  char *zErrMs
187f0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
18800 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
18810 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  sage from sqlite
18820 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a  3ParseUri() */..
18830 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18840 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
18850 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
18860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
18870 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
18880 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
18890 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
188a0 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
188b0 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
188c0 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
188d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
188e0 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69  ndif..  if( sqli
188f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18900 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b  bCoreMutex==0 ){
18910 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
18920 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
18930 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
18940 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29  E_OPEN_NOMUTEX )
18950 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
18960 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
18970 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
18980 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
18990 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
189a0 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  dsafe = 1;.  }el
189b0 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64  se{.    isThread
189c0 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c  safe = sqlite3Gl
189d0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
189e0 4d 75 74 65 78 3b 0a 20 20 7d 0a 0a 20 20 69 66  Mutex;.  }..  if
189f0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
18a00 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
18a10 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  HE ){.    flags 
18a20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
18a30 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
18a40 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
18a50 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
18a60 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
18a70 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
18a80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
18a90 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
18aa0 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75  /* Remove harmfu
18ab0 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20  l bits from the 
18ac0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
18ad0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
18ae0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
18af0 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45  X and SQLITE_OPE
18b00 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67  N_FULLMUTEX flag
18b10 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c  s were.  ** deal
18b20 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72  t with in the pr
18b30 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63  evious code bloc
18b40 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73  k.  Besides thes
18b50 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a  e, the only.  **
18b60 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61   valid input fla
18b70 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f  gs for sqlite3_o
18b80 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c  pen_v2() are SQL
18b90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18ba0 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  Y,.  ** SQLITE_O
18bb0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53  PEN_READWRITE, S
18bc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
18bd0 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  E, SQLITE_OPEN_S
18be0 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a  HAREDCACHE,.  **
18bf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
18c00 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73  VATECACHE, and s
18c10 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74  ome reserved bit
18c20 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73  s.  Silently mas
18c30 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f  k.  ** off all o
18c40 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f  ther flags..  */
18c50 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
18c60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
18c70 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
18c80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18c90 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
18ca0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
18cb0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
18cc0 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20  IN_DB |.        
18cd0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18ce0 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20  EN_TEMP_DB | .  
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18d00 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
18d10 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  NT_DB | .       
18d20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18d30 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
18d40 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
18d50 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
18d60 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  EMP_JOURNAL | . 
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18d80 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
18d90 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
18da0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18db0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
18dc0 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L |.            
18dd0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e     SQLITE_OPEN_N
18de0 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  OMUTEX |.       
18df0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18e00 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a  PEN_FULLMUTEX |.
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18e20 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
18e30 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a              );..
18e40 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
18e50 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74  e sqlite data st
18e60 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20  ructure */.  db 
18e70 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
18e80 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69  ero( sizeof(sqli
18e90 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62  te3) );.  if( db
18ea0 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64  ==0 ) goto opend
18eb0 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54  b_out;.  if( isT
18ec0 68 72 65 61 64 73 61 66 65 20 0a 23 69 66 64 65  hreadsafe .#ifde
18ed0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18ee0 4d 55 4c 54 49 54 48 52 45 41 44 45 44 5f 43 48  MULTITHREADED_CH
18ef0 45 43 4b 53 0a 20 20 20 7c 7c 20 73 71 6c 69 74  ECKS.   || sqlit
18f00 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
18f10 43 6f 72 65 4d 75 74 65 78 0a 23 65 6e 64 69 66  CoreMutex.#endif
18f20 0a 20 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  .  ){.    db->mu
18f30 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
18f40 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
18f50 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
18f60 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
18f70 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
18f80 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
18f90 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
18fa0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
18fb0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
18fc0 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65  if( isThreadsafe
18fd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
18fe0 69 74 65 33 4d 75 74 65 78 57 61 72 6e 4f 6e 43  ite3MutexWarnOnC
18ff0 6f 6e 74 65 6e 74 69 6f 6e 28 64 62 2d 3e 6d 75  ontention(db->mu
19000 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tex);.    }.  }.
19010 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19020 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
19030 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
19040 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44  = 0xff;.  db->nD
19050 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67  b = 2;.  db->mag
19060 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
19070 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44  C_BUSY;.  db->aD
19080 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
19090 63 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  c;.  db->lookasi
190a0 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 31 3b  de.bDisable = 1;
190b0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ..  assert( size
190c0 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d  of(db->aLimit)==
190d0 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69  sizeof(aHardLimi
190e0 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64  t) );.  memcpy(d
190f0 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64  b->aLimit, aHard
19100 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62  Limit, sizeof(db
19110 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62  ->aLimit));.  db
19120 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
19130 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
19140 45 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44  EADS] = SQLITE_D
19150 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48  EFAULT_WORKER_TH
19160 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74  READS;.  db->aut
19170 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64  oCommit = 1;.  d
19180 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d  b->nextAutovac =
19190 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61   -1;.  db->szMma
191a0 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  p = sqlite3Globa
191b0 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
191c0 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69    db->nextPagesi
191d0 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d  ze = 0;.  db->nM
191e0 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30  axSorterMmap = 0
191f0 78 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d  x7FFFFFFF;.  db-
19200 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
19210 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 0a 20  _ShortColNames. 
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
19240 72 69 67 67 65 72 0a 20 20 20 20 20 20 20 20 20  rigger.         
19250 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
19260 5f 45 6e 61 62 6c 65 56 69 65 77 0a 20 20 20 20  _EnableView.    
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
19280 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c  QLITE_CacheSpill
19290 0a 0a 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  ../* The SQLITE_
192a0 44 51 53 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  DQS compile-time
192b0 20 6f 70 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e   option determin
192c0 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 73  es the default s
192d0 65 74 74 69 6e 67 73 0a 2a 2a 20 66 6f 72 20 53  ettings.** for S
192e0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44  QLITE_DBCONFIG_D
192f0 51 53 5f 44 44 4c 20 61 6e 64 20 53 51 4c 49 54  QS_DDL and SQLIT
19300 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44  E_DBCONFIG_DQS_D
19310 4d 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c  ML..**.**    SQL
19320 49 54 45 5f 44 51 53 20 20 20 20 20 53 51 4c 49  ITE_DQS     SQLI
19330 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f  TE_DBCONFIG_DQS_
19340 44 44 4c 20 20 20 20 53 51 4c 49 54 45 5f 44 42  DDL    SQLITE_DB
19350 43 4f 4e 46 49 47 5f 44 51 53 5f 44 4d 4c 0a 2a  CONFIG_DQS_DML.*
19360 2a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  *    ---------- 
19370 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
19380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
19390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193a0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 75 6e  ------.**     un
193b0 64 65 66 69 6e 65 64 20 20 20 20 20 20 20 20 20  defined         
193c0 20 20 20 20 20 20 6f 6e 20 20 20 20 20 20 20 20        on        
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 6f 6e 20 20 20 0a 2a 2a 20 20 20 20 20 20    on   .**      
193f0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
19400 20 20 20 20 20 20 20 6f 6e 20 20 20 20 20 20 20         on       
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19420 20 20 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20     on.**        
19430 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
19440 20 20 20 20 20 6f 6e 20 20 20 20 20 20 20 20 20       on         
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 6f 66 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 31  off.**         1
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19480 20 20 6f 66 66 20 20 20 20 20 20 20 20 20 20 20    off           
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
194a0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 20 20  n.**         0  
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  off             
194d0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 0a              off.
194e0 2a 2a 0a 2a 2a 20 4c 65 67 61 63 79 20 62 65 68  **.** Legacy beh
194f0 61 76 69 6f 72 20 69 73 20 33 20 28 64 6f 75 62  avior is 3 (doub
19500 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
19510 20 6c 69 74 65 72 61 6c 73 20 61 72 65 20 61 6c   literals are al
19520 6c 6f 77 65 64 20 61 6e 79 77 68 65 72 65 29 0a  lowed anywhere).
19530 2a 2a 20 61 6e 64 20 73 6f 20 74 68 61 74 20 69  ** and so that i
19540 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
19550 42 75 74 20 64 65 76 65 6c 6f 70 65 72 73 20 61  But developers a
19560 72 65 20 65 6e 63 6f 75 72 61 6e 67 65 64 20 74  re encouranged t
19570 6f 20 75 73 65 0a 2a 2a 20 2d 44 53 51 4c 49 54  o use.** -DSQLIT
19580 45 5f 44 51 53 3d 30 20 28 62 65 73 74 29 20 6f  E_DQS=0 (best) o
19590 72 20 2d 44 53 51 4c 49 54 45 5f 44 51 53 3d 31  r -DSQLITE_DQS=1
195a0 20 28 73 65 63 6f 6e 64 20 63 68 6f 69 63 65 29   (second choice)
195b0 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f   if possible..*/
195c0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
195d0 4c 49 54 45 5f 44 51 53 29 0a 23 20 64 65 66 69  LITE_DQS).# defi
195e0 6e 65 20 53 51 4c 49 54 45 5f 44 51 53 20 33 0a  ne SQLITE_DQS 3.
195f0 23 65 6e 64 69 66 0a 23 69 66 20 28 53 51 4c 49  #endif.#if (SQLI
19600 54 45 5f 44 51 53 26 31 29 3d 3d 31 0a 20 20 20  TE_DQS&1)==1.   
19610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
19620 53 51 4c 49 54 45 5f 44 71 73 44 4d 4c 0a 23 65  SQLITE_DqsDML.#e
19630 6e 64 69 66 0a 23 69 66 20 28 53 51 4c 49 54 45  ndif.#if (SQLITE
19640 5f 44 51 53 26 32 29 3d 3d 32 0a 20 20 20 20 20  _DQS&2)==2.     
19650 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19660 4c 49 54 45 5f 44 71 73 44 44 4c 0a 23 65 6e 64  LITE_DqsDDL.#end
19670 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
19680 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
19690 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29  AUTOMATIC_INDEX)
196a0 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   || SQLITE_DEFAU
196b0 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  LT_AUTOMATIC_IND
196c0 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EX.             
196d0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74      | SQLITE_Aut
196e0 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69  oIndex.#endif.#i
196f0 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
19700 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20  _CKPTFULLFSYNC. 
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c  | SQLITE_CkptFul
19730 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69  lFSync.#endif.#i
19740 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
19750 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20  _FILE_FORMAT<4. 
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19770 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  | SQLITE_LegacyF
19780 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69  ileFmt.#endif.#i
19790 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
197a0 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
197b0 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
197c0 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64     | SQLITE_Load
197d0 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66  Extension.#endif
197e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
197f0 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52  ULT_RECURSIVE_TR
19800 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20  IGGERS.         
19810 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
19820 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e  _RecTriggers.#en
19830 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
19840 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
19850 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20  OREIGN_KEYS) && 
19860 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
19870 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20  OREIGN_KEYS.    
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
19890 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
198a0 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  s.#endif.#if def
198b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45  ined(SQLITE_REVE
198c0 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45  RSE_UNORDERED_SE
198d0 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20 20 20  LECTS).         
198e0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
198f0 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65  _ReverseOrder.#e
19900 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
19910 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
19920 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
19930 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK).            
19940 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65       | SQLITE_Ce
19950 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a  llSizeCk.#endif.
19960 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19970 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54  TE_ENABLE_FTS3_T
19980 4f 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20 20 20  OKENIZER).      
19990 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
199a0 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65  ITE_Fts3Tokenize
199b0 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  r.#endif.#if def
199c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
199d0 4c 45 5f 51 50 53 47 29 0a 20 20 20 20 20 20 20  LE_QPSG).       
199e0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
199f0 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a 23 65  TE_EnableQPSG.#e
19a00 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
19a10 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
19a20 44 45 46 45 4e 53 49 56 45 29 0a 20 20 20 20 20  DEFENSIVE).     
19a30 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19a40 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 0a 23  LITE_Defensive.#
19a50 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
19a60 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
19a70 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
19a80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19a90 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
19aa0 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
19ab0 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
19ac0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
19ad0 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
19ae0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19af0 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
19b00 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
19b10 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
19b20 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
19b30 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
19b40 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
19b50 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
19b60 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
19b70 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
19b80 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
19b90 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
19ba0 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lure..  **.  ** 
19bb0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19bc0 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74  2786-44878 SQLit
19bd0 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20  e defines three 
19be0 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
19bf0 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ng.  ** function
19c00 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  s:.  */.  create
19c10 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
19c20 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
19c30 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
19c40 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
19c50 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
19c60 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
19c70 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
19c80 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43  UTF16BE, 0, binC
19c90 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
19ca0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
19cb0 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  b, sqlite3StrBIN
19cc0 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ARY, SQLITE_UTF1
19cd0 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6LE, 0, binCollF
19ce0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
19cf0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
19d00 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
19d10 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
19d20 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
19d30 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
19d40 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
19d50 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
19d60 20 72 74 72 69 6d 43 6f 6c 6c 46 75 6e 63 2c 20   rtrimCollFunc, 
19d70 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
19d80 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19d90 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
19da0 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44  t;.  }.  /* EVID
19db0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38  ENCE-OF: R-08308
19dc0 2d 31 37 32 32 34 20 54 68 65 20 64 65 66 61 75  -17224 The defau
19dd0 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  lt collating fun
19de0 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20  ction for all.  
19df0 2a 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42 49  ** strings is BI
19e00 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62  NARY. .  */.  db
19e10 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71  ->pDfltColl = sq
19e20 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
19e30 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
19e40 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  , sqlite3StrBINA
19e50 52 59 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  RY, 0);.  assert
19e60 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21  ( db->pDfltColl!
19e70 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73  =0 );..  /* Pars
19e80 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55  e the filename/U
19e90 52 49 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a  RI argument.  **
19ea0 0a 20 20 2a 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77  .  ** Only allow
19eb0 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   sensible combin
19ec0 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69  ations of bits i
19ed0 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75  n the flags argu
19ee0 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72  ment.  .  ** Thr
19ef0 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  ow an error if a
19f00 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d  ny non-sense com
19f10 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64  bination is used
19f20 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f  .  If we.  ** do
19f30 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67   not block illeg
19f40 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  al combinations 
19f50 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74  here, it could t
19f60 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65  rigger.  ** asse
19f70 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
19f80 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72 73  in deeper layers
19f90 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62  .  Sensible comb
19fa0 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72  inations.  ** ar
19fb0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a  e:.  **.  **  1:
19fc0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
19fd0 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20  ADONLY.  **  2: 
19fe0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
19ff0 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20  DWRITE.  **  6: 
1a000 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1a010 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1a020 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f  OPEN_CREATE.  */
1a030 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  .  db->openFlags
1a040 20 3d 20 66 6c 61 67 73 3b 0a 20 20 61 73 73 65   = flags;.  asse
1a050 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
1a060 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30  READONLY  == 0x0
1a070 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
1a080 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a090 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a  RITE == 0x02 );.
1a0a0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1a0b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20  _OPEN_CREATE    
1a0c0 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73  == 0x04 );.  tes
1a0d0 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
1a0e0 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f  s&7))==0x02 ); /
1a0f0 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20  * READONLY */.  
1a100 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
1a110 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29  lags&7))==0x04 )
1a120 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a  ; /* READWRITE *
1a130 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
1a140 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
1a150 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  40 ); /* READWRI
1a160 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20  TE | CREATE */. 
1a170 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73   if( ((1<<(flags
1a180 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20  &7)) & 0x46)==0 
1a190 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a1a0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20  TE_MISUSE_BKPT; 
1a1b0 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37   /* IMP: R-65497
1a1c0 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 65 6c 73  -44594 */.  }els
1a1d0 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
1a1e0 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73  te3ParseUri(zVfs
1a1f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c  , zFilename, &fl
1a200 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20  ags, &db->pVfs, 
1a210 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67  &zOpen, &zErrMsg
1a220 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1a230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a250 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69 74 65 33  _NOMEM ) sqlite3
1a260 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
1a270 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
1a280 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a 45  thMsg(db, rc, zE
1a290 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30  rrMsg ? "%s" : 0
1a2a0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
1a2b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
1a2c0 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rMsg);.    goto 
1a2d0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
1a2e0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62  .  /* Open the b
1a2f0 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20  ackend database 
1a300 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d  driver */.  rc =
1a310 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
1a320 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65  n(db->pVfs, zOpe
1a330 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b  n, db, &db->aDb[
1a340 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20  0].pBt, 0,.     
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54     flags | SQLIT
1a370 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b  E_OPEN_MAIN_DB);
1a380 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1a3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1a3b0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
1a3c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a3d0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
1a3e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
1a3f0 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f  b, rc);.    goto
1a400 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
1a410 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a420 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  nter(db->aDb[0].
1a430 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
1a440 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  0].pSchema = sql
1a450 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
1a460 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  , db->aDb[0].pBt
1a470 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
1a480 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43  llocFailed ) ENC
1a490 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e  (db) = SCHEMA_EN
1a4a0 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  C(db);.  sqlite3
1a4b0 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61  BtreeLeave(db->a
1a4c0 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62  Db[0].pBt);.  db
1a4d0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
1a4e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1a4f0 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f  Get(db, 0);..  /
1a500 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61  * The default sa
1a510 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74  fety_level for t
1a520 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1a530 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72 20 74 68   is FULL; for th
1a540 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61  e temp.  ** data
1a550 62 61 73 65 20 69 74 20 69 73 20 4f 46 46 2e 20  base it is OFF. 
1a560 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
1a570 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66   pager layer def
1a580 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  aults.  .  */.  
1a590 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e  db->aDb[0].zDbSN
1a5a0 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
1a5b0 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
1a5c0 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45  y_level = SQLITE
1a5d0 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
1a5e0 4e 4f 55 53 2b 31 3b 0a 20 20 64 62 2d 3e 61 44  NOUS+1;.  db->aD
1a5f0 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20  b[1].zDbSName = 
1a600 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44  "temp";.  db->aD
1a610 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[1].safety_leve
1a620 6c 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 48 52  l = PAGER_SYNCHR
1a630 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20 20 64 62  ONOUS_OFF;..  db
1a640 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1a650 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69  _MAGIC_OPEN;.  i
1a660 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1a670 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1a680 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
1a690 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
1a6a0 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63  ll built-in func
1a6b0 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f  tions, but do no
1a6c0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  t attempt to rea
1a6d0 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  d the.  ** datab
1a6e0 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20  ase schema yet. 
1a6f0 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20  This is delayed 
1a700 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
1a710 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
1a720 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73  e.  ** is access
1a730 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
1a740 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
1a750 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65  TE_OK);.  sqlite
1a760 33 52 65 67 69 73 74 65 72 50 65 72 43 6f 6e 6e  3RegisterPerConn
1a770 65 63 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75 6e  ectionBuiltinFun
1a780 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63  ctions(db);.  rc
1a790 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
1a7a0 64 65 28 64 62 29 3b 0a 0a 23 69 66 64 65 66 20  de(db);..#ifdef 
1a7b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1a7c0 53 35 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  S5.  /* Register
1a7d0 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 46 54   any built-in FT
1a7e0 53 35 20 6d 6f 64 75 6c 65 20 62 65 66 6f 72 65  S5 module before
1a7f0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 61 75 74   loading the aut
1a800 6f 6d 61 74 69 63 0a 20 20 2a 2a 20 65 78 74 65  omatic.  ** exte
1a810 6e 73 69 6f 6e 73 2e 20 54 68 69 73 20 61 6c 6c  nsions. This all
1a820 6f 77 73 20 61 75 74 6f 6d 61 74 69 63 20 65 78  ows automatic ex
1a830 74 65 6e 73 69 6f 6e 73 20 74 6f 20 72 65 67 69  tensions to regi
1a840 73 74 65 72 20 46 54 53 35 20 0a 20 20 2a 2a 20  ster FTS5 .  ** 
1a850 74 6f 6b 65 6e 69 7a 65 72 73 20 61 6e 64 20 61  tokenizers and a
1a860 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f  uxiliary functio
1a870 6e 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  ns.  */.  if( !d
1a880 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a890 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1a8a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a8b0 69 74 65 33 46 74 73 35 49 6e 69 74 28 64 62 29  ite3Fts5Init(db)
1a8c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1a8d0 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69  /* Load automati
1a8e0 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65  c extensions - e
1a8f0 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68  xtensions that h
1a900 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65  ave been registe
1a910 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  red.  ** using t
1a920 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d  he sqlite3_autom
1a930 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29  atic_extension()
1a940 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   API..  */.  if(
1a950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a960 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  {.    sqlite3Aut
1a970 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28  oLoadExtensions(
1a980 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  db);.    rc = sq
1a990 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
1a9a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1a9b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a9c0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
1a9d0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  t;.    }.  }..#i
1a9e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a9f0 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64  LE_FTS1.  if( !d
1aa00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1aa10 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
1aa20 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  t sqlite3Fts1Ini
1aa30 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
1aa40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
1aa50 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  1Init(db);.  }.#
1aa60 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1aa70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32  LITE_ENABLE_FTS2
1aa80 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
1aa90 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
1aaa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aab0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1aac0 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69  te3Fts2Init(sqli
1aad0 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
1aae0 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
1aaf0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1ab00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1ab10 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75  NABLE_FTS3 /* au
1ab20 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69  tomatically defi
1ab30 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f 45 4e  ned by SQLITE_EN
1ab40 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69  ABLE_FTS4 */.  i
1ab50 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1ab60 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1ab70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1ab80 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  = sqlite3Fts3Ini
1ab90 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
1aba0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
1abb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
1abc0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1abd0 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f 43  ITE_ENABLE_ICU_C
1abe0 4f 4c 4c 41 54 49 4f 4e 53 29 0a 20 20 69 66 28  OLLATIONS).  if(
1abf0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1ac00 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
1ac10 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1ac20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64  sqlite3IcuInit(d
1ac30 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1ac40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1ac50 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28  ABLE_RTREE.  if(
1ac60 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1ac70 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
1ac80 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
1ac90 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28  qlite3RtreeInit(
1aca0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1acb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1acc0 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41  NABLE_DBPAGE_VTA
1acd0 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  B.  if( !db->mal
1ace0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1acf0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
1ad00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 70   rc = sqlite3Dbp
1ad10 61 67 65 52 65 67 69 73 74 65 72 28 64 62 29 3b  ageRegister(db);
1ad20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1ad30 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ad40 45 5f 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20  E_DBSTAT_VTAB.  
1ad50 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1ad60 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
1ad70 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
1ad80 3d 20 73 71 6c 69 74 65 33 44 62 73 74 61 74 52  = sqlite3DbstatR
1ad90 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d  egister(db);.  }
1ada0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1adb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53  SQLITE_ENABLE_JS
1adc0 4f 4e 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  ON1.  if( !db->m
1add0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
1ade0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
1adf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
1ae00 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  son1Init(db);.  
1ae10 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1ae20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1ae30 54 4d 54 56 54 41 42 0a 20 20 69 66 28 20 21 64  TMTVTAB.  if( !d
1ae40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ae50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1ae60 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ae70 74 65 33 53 74 6d 74 56 74 61 62 49 6e 69 74 28  te3StmtVtabInit(
1ae80 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1ae90 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44  .  /* -DSQLITE_D
1aea0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
1aeb0 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c  ODE=1 makes EXCL
1aec0 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c  USIVE the defaul
1aed0 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
1aee0 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44  ode.  -DSQLITE_D
1aef0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
1af00 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41  ODE=0 make NORMA
1af10 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  L the default lo
1af20 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
1af30 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20    Doing nothing 
1af40 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65  at all also make
1af50 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  s NORMAL the def
1af60 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ault..  */.#ifde
1af70 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1af80 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20  _LOCKING_MODE.  
1af90 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  db->dfltLockMode
1afa0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
1afb0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a  T_LOCKING_MODE;.
1afc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f    sqlite3PagerLo
1afd0 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65  ckingMode(sqlite
1afe0 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
1aff0 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20  aDb[0].pBt),.   
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
1b020 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
1b030 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  DE);.#endif..  i
1b040 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45  f( rc ) sqlite3E
1b050 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20  rror(db, rc);.. 
1b060 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
1b070 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
1b080 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
1b090 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
1b0a0 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
1b0b0 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
1b0c0 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1b0e0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b0f0 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
1b100 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
1b110 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
1b120 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1b130 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
1b140 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  NT);..opendb_out
1b150 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  :.  if( db ){.  
1b160 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75    assert( db->mu
1b170 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65  tex!=0 || isThre
1b180 61 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20  adsafe==0.      
1b190 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
1b1a0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
1b1b0 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  lMutex==0 );.   
1b1c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b1d0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1b1e0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1b1f0 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
1b200 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1b210 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
1b220 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63  OMEM );.  if( rc
1b230 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
1b240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  {.    sqlite3_cl
1b250 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20  ose(db);.    db 
1b260 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
1b270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b280 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1b290 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53  = SQLITE_MAGIC_S
1b2a0 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62  ICK;.  }.  *ppDb
1b2b0 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51   = db;.#ifdef SQ
1b2c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
1b2d0 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  OG.  if( sqlite3
1b2e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
1b2f0 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  llog ){.    /* O
1b300 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64  pening a db hand
1b310 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
1b320 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30  eter is passed 0
1b330 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  . */.    void *p
1b340 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Arg = sqlite3Glo
1b350 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
1b360 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  gArg;.    sqlite
1b370 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
1b380 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20  qllog(pArg, db, 
1b390 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
1b3a0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
1b3b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
1b3c0 5f 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72 63  _CODEC).  if( rc
1b3d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73 71  ==SQLITE_OK ) sq
1b3e0 6c 69 74 65 33 43 6f 64 65 63 51 75 65 72 79 50  lite3CodecQueryP
1b3f0 61 72 61 6d 65 74 65 72 73 28 64 62 2c 20 30 2c  arameters(db, 0,
1b400 20 7a 4f 70 65 6e 29 3b 0a 23 65 6e 64 69 66 0a   zOpen);.#endif.
1b410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1b420 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  Open);.  return 
1b430 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 0a 2f  rc & 0xff;.}.../
1b440 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
1b450 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
1b460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b470 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  open(.  const ch
1b480 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  ar *zFilename, .
1b490 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
1b4a0 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70   .){.  return op
1b4b0 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
1b4c0 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20  name, ppDb,.    
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1b4f0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
1b500 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
1b510 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
1b520 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74  open_v2(.  const
1b530 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c   char *filename,
1b540 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
1b550 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20  ilename (UTF-8) 
1b560 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
1b570 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pDb,         /* 
1b580 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68  OUT: SQLite db h
1b590 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  andle */.  int f
1b5a0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
1b5b0 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20     /* Flags */. 
1b5c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
1b5d0 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  s        /* Name
1b5e0 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74   of VFS module t
1b5f0 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  o use */.){.  re
1b600 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
1b610 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  e(filename, ppDb
1b620 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
1b630 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a  flags, zVfs);.}.
1b640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b650 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
1b660 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
1b670 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
1b680 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
1b690 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16(.  const void
1b6a0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
1b6b0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29  sqlite3 **ppDb.)
1b6c0 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
1b6d0 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a  zFilename8;   /*
1b6e0 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64   zFilename encod
1b6f0 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74  ed in UTF-8 inst
1b700 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f  ead of UTF-16 */
1b710 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1b720 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63   *pVal;.  int rc
1b730 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1b740 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1b750 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
1b760 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b770 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1b780 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
1b790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b7a0 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
1b7b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
1b7c0 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
1b7d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1b7e0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46  .#endif.  if( zF
1b7f0 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69  ilename==0 ) zFi
1b800 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30  lename = "\000\0
1b810 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  00";.  pVal = sq
1b820 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
1b830 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
1b840 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
1b850 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49   zFilename, SQLI
1b860 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
1b870 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
1b880 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73    zFilename8 = s
1b890 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1b8a0 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
1b8b0 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  8);.  if( zFilen
1b8c0 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
1b8d0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
1b8e0 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a  ilename8, ppDb,.
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1b910 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
1b920 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1b930 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1b940 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
1b950 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
1b960 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b970 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
1b980 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
1b990 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
1b9a0 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d  ) ){.      SCHEM
1b9b0 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45  A_ENC(*ppDb) = E
1b9c0 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
1b9d0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
1b9e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b9f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1ba00 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
1ba10 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
1ba20 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
1ba30 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a  rn rc & 0xff;.}.
1ba40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ba50 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
1ba60 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
1ba70 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
1ba80 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
1ba90 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1baa0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
1bab0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
1bac0 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
1bad0 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
1bae0 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
1baf0 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
1bb00 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
1bb10 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
1bb20 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
1bb30 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
1bb40 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1bb50 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1bb60 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c  on_v2(db, zName,
1bb70 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d   enc, pCtx, xCom
1bb80 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pare, 0);.}../*.
1bb90 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
1bba0 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
1bbb0 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
1bbc0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
1bbd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1bbe0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1bbf0 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a  n_v2(.  sqlite3*
1bc00 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
1bc10 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
1bc20 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
1bc30 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
1bc40 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
1bc50 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
1bc60 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
1bc70 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
1bc80 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
1bc90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1bca0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1bcb0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1bcc0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1bcd0 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72   || zName==0 ) r
1bce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1bcf0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1bd00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1bd10 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1bd20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
1bd30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1bd40 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
1bd50 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
1bd60 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  me, (u8)enc, pCt
1bd70 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65  x, xCompare, xDe
1bd80 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
1bd90 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
1bda0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1bdb0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1bdc0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1bdd0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1bde0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
1bdf0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1be00 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
1be10 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
1be20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1be30 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
1be40 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1be50 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
1be60 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76  * db, .  const v
1be70 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  oid *zName,.  in
1be80 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
1be90 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
1bea0 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
1beb0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
1bec0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
1bed0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1bee0 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
1bef0 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53  Name8;..#ifdef S
1bf00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1bf10 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1bf20 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1bf30 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d  Ok(db) || zName=
1bf40 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1bf50 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1bf60 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1bf70 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1bf80 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
1bf90 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
1bfa0 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38  iled );.  zName8
1bfb0 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
1bfc0 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  o8(db, zName, -1
1bfd0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
1bfe0 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61  TIVE);.  if( zNa
1bff0 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
1c000 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
1c010 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29  db, zName8, (u8)
1c020 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
1c030 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  are, 0);.    sql
1c040 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1c050 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63  Name8);.  }.  rc
1c060 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
1c070 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
1c080 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1c090 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1c0a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1c0b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1c0c0 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
1c0d0 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
1c0e0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1c0f0 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
1c100 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1c110 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
1c120 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
1c130 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
1c140 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
1c150 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
1c160 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
1c170 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20  lation_needed(. 
1c180 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
1c190 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
1c1a0 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
1c1b0 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69  xCollNeeded)(voi
1c1c0 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
1c1d0 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63  eTextRep,const c
1c1e0 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20  har*).){.#ifdef 
1c1f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1c200 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1c210 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1c220 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
1c230 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1c240 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1c250 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c260 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1c270 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
1c280 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20  = xCollNeeded;. 
1c290 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
1c2a0 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43  16 = 0;.  db->pC
1c2b0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70  ollNeededArg = p
1c2c0 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20  CollNeededArg;. 
1c2d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c2e0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1c2f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c300 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
1c310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1c320 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  6./*.** Register
1c330 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
1c340 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61  uence factory ca
1c350 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
1c360 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
1c370 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61  ** db. Replace a
1c380 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ny previously in
1c390 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f  stalled collatio
1c3a0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
1c3b0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
1c3c0 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
1c3d0 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ded16(.  sqlite3
1c3e0 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
1c3f0 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
1c400 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
1c410 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c  ded16)(void*,sql
1c420 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
1c430 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  ep,const void*).
1c440 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1c450 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1c460 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1c470 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1c480 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1c490 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1c4a0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1c4b0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1c4c0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
1c4d0 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  ollNeeded = 0;. 
1c4e0 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
1c4f0 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  16 = xCollNeeded
1c500 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e  16;.  db->pCollN
1c510 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
1c520 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
1c530 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1c540 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1c550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c560 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1c570 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1c580 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1c590 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1c5a0 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  D./*.** This fun
1c5b0 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20  ction is now an 
1c5c0 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20  anachronism. It 
1c5d0 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  used to be used 
1c5e0 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
1c5f0 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61  a.** malloc() fa
1c600 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74  ilure, but SQLit
1c610 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20  e now does this 
1c620 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
1c630 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c  /.int sqlite3_gl
1c640 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69  obal_recover(voi
1c650 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
1c660 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1c670 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
1c680 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
1c690 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
1c6a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
1c6b0 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d   autocommit.** m
1c6c0 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ode.  Return TRU
1c6d0 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46  E if it is and F
1c6e0 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75  ALSE if not.  Au
1c6f0 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73  tocommit mode is
1c700 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c   on.** by defaul
1c710 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69  t.  Autocommit i
1c720 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20  s disabled by a 
1c730 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20  BEGIN statement 
1c740 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a  and reenabled.**
1c750 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d   by the next COM
1c760 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e  MIT or ROLLBACK.
1c770 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1c780 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
1c790 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
1c7a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1c7b0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1c7c0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1c7d0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
1c7e0 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
1c7f0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
1c800 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
1c810 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64  endif.  return d
1c820 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d  b->autoCommit;.}
1c830 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1c840 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
1c850 72 65 20 73 75 62 73 74 69 74 75 74 65 73 20 66  re substitutes f
1c860 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c  or constants SQL
1c870 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20  ITE_CORRUPT,.** 
1c880 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53  SQLITE_MISUSE, S
1c890 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
1c8a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1c8b0 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20   possibly other 
1c8c0 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e  error.** constan
1c8d0 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 20  ts.  They serve 
1c8e0 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a  two purposes:.**
1c8f0 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20  .**   1.  Serve 
1c900 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  as a convenient 
1c910 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
1c920 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64  reakpoint in a d
1c930 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20  ebugger.**      
1c940 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
1c950 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f  version error co
1c960 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e  nditions occurs.
1c970 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76  .**.**   2.  Inv
1c980 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  oke sqlite3_log(
1c990 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  ) to provide the
1c9a0 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63   source code loc
1c9b0 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20  ation where.**  
1c9c0 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c       a low-level
1c9d0 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20   error is first 
1c9e0 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74  detected..*/.int
1c9f0 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72   sqlite3ReportEr
1ca00 72 6f 72 28 69 6e 74 20 69 45 72 72 2c 20 69 6e  ror(int iErr, in
1ca10 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20  t lineno, const 
1ca20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20  char *zType){.  
1ca30 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72 72  sqlite3_log(iErr
1ca40 2c 20 22 25 73 20 61 74 20 6c 69 6e 65 20 25 64  , "%s at line %d
1ca50 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70              zTyp
1ca70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71  e, lineno, 20+sq
1ca80 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
1ca90 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 45 72 72  );.  return iErr
1caa0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ;.}.int sqlite3C
1cab0 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
1cac0 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
1cad0 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
1cae0 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
1caf0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
1cb00 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28  ite3ReportError(
1cb10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1cb20 6c 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61 73  lineno, "databas
1cb30 65 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b 0a  e corruption");.
1cb40 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73  }.int sqlite3Mis
1cb50 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  useError(int lin
1cb60 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1cb70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1cb80 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1cb90 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1cba0 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1cbb0 49 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65  ITE_MISUSE, line
1cbc0 6e 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d  no, "misuse");.}
1cbd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74  .int sqlite3Cant
1cbe0 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69  openError(int li
1cbf0 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1cc00 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1cc10 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1cc20 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1cc30 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1cc40 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c  LITE_CANTOPEN, l
1cc50 69 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f  ineno, "cannot o
1cc60 70 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69  pen file");.}.#i
1cc70 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cc80 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72  G.int sqlite3Cor
1cc90 72 75 70 74 50 67 6e 6f 45 72 72 6f 72 28 69 6e  ruptPgnoError(in
1cca0 74 20 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70  t lineno, Pgno p
1ccb0 67 6e 6f 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73  gno){.  char zMs
1ccc0 67 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  g[100];.  sqlite
1ccd0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1cce0 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c 20 22  f(zMsg), zMsg, "
1ccf0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1cd00 69 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 70 67  ion page %d", pg
1cd10 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  no);.  testcase(
1cd20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1cd30 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1cd40 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1cd50 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  ReportError(SQLI
1cd60 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65  TE_CORRUPT, line
1cd70 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74  no, zMsg);.}.int
1cd80 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72   sqlite3NomemErr
1cd90 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1cda0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1cdb0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cdc0 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1cdd0 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1cde0 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f  tError(SQLITE_NO
1cdf0 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f  MEM, lineno, "OO
1ce00 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  M");.}.int sqlit
1ce10 65 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f  e3IoerrnomemErro
1ce20 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
1ce30 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1ce40 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1ce50 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Log!=0 );.  retu
1ce60 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74  rn sqlite3Report
1ce70 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1ce80 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f  RR_NOMEM, lineno
1ce90 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72  , "I/O OOM error
1cea0 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ");.}.#endif..#i
1ceb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cec0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
1ced0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
1cee0 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
1cef0 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
1cf00 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
1cf10 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
1cf20 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
1cf30 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
1cf40 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
1cf50 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
1cf60 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
1cf70 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
1cf80 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
1cf90 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
1cfa0 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
1cfb0 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
1cfc0 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
1cfd0 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
1cfe0 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
1cff0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1d000 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
1d010 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
1d020 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
1d030 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
1d040 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
1d050 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
1d060 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
1d070 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69  or details..*/.i
1d080 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  nt sqlite3_table
1d090 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
1d0a0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0c0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  /* Connection ha
1d0d0 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
1d0e0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20  char *zDbName,  
1d0f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1d100 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a  e name or NULL *
1d110 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1d120 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  zTableName,     
1d130 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
1d140 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d150 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f  ColumnName,    /
1d160 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
1d170 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
1d180 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f  pzDataType,    /
1d190 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72  * OUTPUT: Declar
1d1a0 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a  ed data type */.
1d1b0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
1d1c0 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a  zCollSeq,     /*
1d1d0 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69   OUTPUT: Collati
1d1e0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
1d1f0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e   */.  int *pNotN
1d200 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
1d210 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1d220 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  e if NOT NULL co
1d230 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20  nstraint exists 
1d240 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61  */.  int *pPrima
1d250 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ryKey,          
1d260 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
1d270 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20   if column part 
1d280 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  of PK */.  int *
1d290 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20  pAutoinc        
1d2a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
1d2b0 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
1d2c0 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65   is auto-increme
1d2d0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
1d2e0 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
1d2f0 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  sg = 0;.  Table 
1d300 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c  *pTab = 0;.  Col
1d310 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20  umn *pCol = 0;. 
1d320 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20   int iCol = 0;. 
1d330 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61   char const *zDa
1d340 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  taType = 0;.  ch
1d350 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53  ar const *zCollS
1d360 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f  eq = 0;.  int no
1d370 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  tnull = 0;.  int
1d380 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b   primarykey = 0;
1d390 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d  .  int autoinc =
1d3a0 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c   0;...#ifdef SQL
1d3b0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1d3c0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1d3d0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1d3e0 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61  (db) || zTableNa
1d3f0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1d400 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1d410 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
1d420 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  if..  /* Ensure 
1d430 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1d440 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61  ema has been loa
1d450 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
1d460 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1d470 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74  >mutex);.  sqlit
1d480 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
1d490 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  db);.  rc = sqli
1d4a0 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72  te3Init(db, &zEr
1d4b0 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c  rMsg);.  if( SQL
1d4c0 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1d4d0 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
1d4e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
1d4f0 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
1d500 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54  question */.  pT
1d510 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
1d520 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65  Table(db, zTable
1d530 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  Name, zDbName);.
1d540 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70    if( !pTab || p
1d550 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
1d560 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
1d570 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
1d580 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
1d590 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   the column for 
1d5a0 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65  which info is re
1d5b0 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
1d5c0 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20   zColumnName==0 
1d5d0 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20  ){.    /* Query 
1d5e0 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66  for existance of
1d5f0 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20   table only */. 
1d600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
1d610 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
1d620 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
1d630 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
1d640 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
1d650 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
1d660 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1d670 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
1d680 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
1d690 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d6a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1d6b0 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
1d6c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61   ){.      if( Ha
1d6d0 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
1d6e0 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
1d6f0 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20  ColumnName) ){. 
1d700 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54         iCol = pT
1d710 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
1d720 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d     pCol = iCol>=
1d730 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 ? &pTab->aCol[
1d740 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20  iCol] : 0;.     
1d750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d760 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
1d770 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
1d780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d790 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1d7a0 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
1d7b0 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
1d7c0 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
1d7d0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
1d7e0 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
1d7f0 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
1d800 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
1d810 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
1d820 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
1d830 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
1d840 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
1d850 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
1d860 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
1d870 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
1d880 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
1d890 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
1d8a0 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
1d8b0 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
1d8c0 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
1d8d0 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
1d8e0 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
1d8f0 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
1d900 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
1d910 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
1d920 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
1d930 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
1d940 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
1d950 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
1d960 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
1d970 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
1d980 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
1d990 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
1d9a0 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 73     zDataType = s
1d9b0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
1d9c0 28 70 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43  (pCol,0);.    zC
1d9d0 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
1d9e0 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
1d9f0 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
1da00 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
1da10 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63  ykey  = (pCol->c
1da20 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
1da30 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20  G_PRIMKEY)!=0;. 
1da40 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
1da50 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
1da60 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
1da70 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
1da80 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
1da90 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
1daa0 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
1dab0 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
1dac0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
1dad0 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
1dae0 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74 65 33 53  llSeq = sqlite3S
1daf0 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65  trBINARY;.  }..e
1db00 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
1db10 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
1db20 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74  (db);..  /* Whet
1db30 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  her the function
1db40 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20   call succeeded 
1db50 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74  or failed, set t
1db60 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
1db70 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61  ters.  ** to wha
1db80 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61  tever their loca
1db90 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63  l counterparts c
1dba0 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72  ontain. If an er
1dbb0 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20  ror did occur,. 
1dbc0 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65   ** this has the
1dbd0 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69   effect of zeroi
1dbe0 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61  ng all output pa
1dbf0 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
1dc00 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20   if( pzDataType 
1dc10 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20  ) *pzDataType = 
1dc20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28  zDataType;.  if(
1dc30 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a   pzCollSeq ) *pz
1dc40 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53  CollSeq = zCollS
1dc50 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75  eq;.  if( pNotNu
1dc60 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d  ll ) *pNotNull =
1dc70 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20   notnull;.  if( 
1dc80 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70  pPrimaryKey ) *p
1dc90 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69  PrimaryKey = pri
1dca0 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70  marykey;.  if( p
1dcb0 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f  Autoinc ) *pAuto
1dcc0 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a  inc = autoinc;..
1dcd0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
1dce0 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a  =rc && !pTab ){.
1dcf0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1dd00 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
1dd10 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
1dd20 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1dd30 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20   "no such table 
1dd40 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20  column: %s.%s", 
1dd50 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20  zTableName,.    
1dd60 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29      zColumnName)
1dd70 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
1dd80 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  E_ERROR;.  }.  s
1dd90 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
1dda0 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72  sg(db, rc, (zErr
1ddb0 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72  Msg?"%s":0), zEr
1ddc0 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
1ddd0 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
1dde0 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  sg);.  rc = sqli
1ddf0 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
1de00 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
1de10 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1de20 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1de30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  c;.}../*.** Slee
1de40 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
1de50 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
1de60 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
1de70 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
1de80 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74  qlite3_sleep(int
1de90 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   ms){.  sqlite3_
1dea0 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74  vfs *pVfs;.  int
1deb0 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71   rc;.  pVfs = sq
1dec0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1ded0 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30  );.  if( pVfs==0
1dee0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
1def0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
1df00 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73   works in millis
1df10 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20  econds, but the 
1df20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65  underlying OsSle
1df30 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75  ep() .  ** API u
1df40 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  ses microseconds
1df50 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30  . Hence the 1000
1df60 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  's..  */.  rc = 
1df70 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28  (sqlite3OsSleep(
1df80 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31  pVfs, 1000*ms)/1
1df90 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  000);.  return r
1dfa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  c;.}../*.** Enab
1dfb0 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
1dfc0 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c  e extended resul
1dfd0 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t codes..*/.int 
1dfe0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1dff0 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71  _result_codes(sq
1e000 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f  lite3 *db, int o
1e010 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66 20 53 51  noff){.#ifdef SQ
1e020 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1e030 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1e040 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1e050 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
1e060 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1e070 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1e080 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1e090 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
1e0a0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66  ->errMask = onof
1e0b0 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  f ? 0xffffffff :
1e0c0 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33   0xff;.  sqlite3
1e0d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1e0e0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1e0f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e100 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
1e110 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65   xFileControl me
1e120 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63  thod on a partic
1e130 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a  ular database..*
1e140 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69  /.int sqlite3_fi
1e150 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  le_control(sqlit
1e160 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
1e170 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74  ar *zDbName, int
1e180 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1e190 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1e1a0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72  ITE_ERROR;.  Btr
1e1b0 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66  ee *pBtree;..#if
1e1c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1e1d0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1e1e0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1e1f0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
1e200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1e210 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1e220 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e230 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1e240 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c  ;.  pBtree = sql
1e250 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1e260 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
1e270 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1e280 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
1e290 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  r;.    sqlite3_f
1e2a0 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c  ile *fd;.    sql
1e2b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1e2c0 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67  Btree);.    pPag
1e2d0 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
1e2e0 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a  ePager(pBtree);.
1e2f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e300 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20  er!=0 );.    fd 
1e310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
1e320 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
1e330 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b  assert( fd!=0 );
1e340 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  .    if( op==SQL
1e350 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
1e360 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
1e370 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a  *(sqlite3_file**
1e380 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20  )pArg = fd;.    
1e390 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1e3a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e3b0 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1e3c0 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a  _VFS_POINTER ){.
1e3d0 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f        *(sqlite3_
1e3e0 76 66 73 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  vfs**)pArg = sql
1e3f0 69 74 65 33 50 61 67 65 72 56 66 73 28 70 50 61  ite3PagerVfs(pPa
1e400 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1e410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e420 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51  }else if( op==SQ
1e430 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e  LITE_FCNTL_JOURN
1e440 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  AL_POINTER ){.  
1e450 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69      *(sqlite3_fi
1e460 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  le**)pArg = sqli
1e470 74 65 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65  te3PagerJrnlFile
1e480 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1e490 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e4a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1e4b0 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  ==SQLITE_FCNTL_D
1e4c0 41 54 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20  ATA_VERSION ){. 
1e4d0 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20       *(unsigned 
1e4e0 69 6e 74 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  int*)pArg = sqli
1e4f0 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72 73  te3PagerDataVers
1e500 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ion(pPager);.   
1e510 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1e520 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1e530 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e540 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64  OsFileControl(fd
1e550 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20  , op, pArg);.   
1e560 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1e570 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1e580 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1e590 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1e5a0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1e5b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
1e5c0 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
1e5d0 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
1e5e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
1e5f0 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
1e600 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
1e610 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1e620 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20  ITE_UNTESTABLE. 
1e630 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1e640 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76  R(op);.#else.  v
1e650 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f  a_list ap;.  va_
1e660 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
1e670 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a   switch( op ){..
1e680 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61      /*.    ** Sa
1e690 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ve the current s
1e6a0 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
1e6b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e6c0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e6d0 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20  L_PRNG_SAVE: {. 
1e6e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
1e6f0 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20  SaveState();.   
1e700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e710 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
1e720 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65  estore the state
1e730 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20   of the PRNG to 
1e740 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73  the last state s
1e750 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  aved using.    *
1e760 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66  * PRNG_SAVE.  If
1e770 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e   PRNG_SAVE has n
1e780 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1e790 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20   called, then.  
1e7a0 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61    ** this verb a
1e7b0 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45  cts like PRNG_RE
1e7c0 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  SET..    */.    
1e7d0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e7e0 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
1e7f0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1e800 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61  e3PrngRestoreSta
1e810 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
1e820 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1e830 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1e840 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1e850 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 45 45 44  STCTRL_PRNG_SEED
1e860 2c 20 69 6e 74 20 78 2c 20 73 71 6c 69 74 65 33  , int x, sqlite3
1e870 20 2a 64 62 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   *db);.    **.  
1e880 20 20 2a 2a 20 43 6f 6e 74 72 6f 6c 20 74 68 65    ** Control the
1e890 20 73 65 65 64 20 66 6f 72 20 74 68 65 20 70 73   seed for the ps
1e8a0 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62  eudo-random numb
1e8b0 65 72 20 67 65 6e 65 72 61 74 6f 72 20 28 50 52  er generator (PR
1e8c0 4e 47 29 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  NG) that.    ** 
1e8d0 69 73 20 62 75 69 6c 74 20 69 6e 74 6f 20 53 51  is built into SQ
1e8e0 4c 69 74 65 2e 20 20 43 61 73 65 73 3a 0a 20 20  Lite.  Cases:.  
1e8f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
1e900 21 3d 30 20 26 26 20 64 62 21 3d 30 20 20 20 20  !=0 && db!=0    
1e910 20 20 20 53 65 65 64 20 74 68 65 20 50 52 4e 47     Seed the PRNG
1e920 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1e930 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 20 20 20  value of the.   
1e940 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1e950 20 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d             schem
1e960 61 20 63 6f 6f 6b 69 65 20 69 6e 20 74 68 65 20  a cookie in the 
1e970 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 6f  main database fo
1e980 72 20 64 62 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  r db, or.    ** 
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 20 20 20 20 20 78 20 69 66 20 74 68 65 20         x if the 
1e9b0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
1e9c0 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 63 61 73   zero.  This cas
1e9d0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
1ea00 20 75 73 65 20 77 69 74 68 20 64 61 74 61 62 61   use with databa
1ea10 73 65 20 66 75 7a 7a 65 72 73 0a 20 20 20 20 2a  se fuzzers.    *
1ea20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ea30 20 20 20 20 20 20 20 20 20 61 73 20 69 74 20 61           as it a
1ea40 6c 6c 6f 77 73 20 74 68 65 20 66 75 7a 7a 65 72  llows the fuzzer
1ea50 20 73 6f 6d 65 20 63 6f 6e 74 72 6f 6c 20 6f 76   some control ov
1ea60 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 20 20  er the.    **   
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 74 68 65 20 50 52 4e 47 20 73 65       the PRNG se
1ea90 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1eaa0 2a 20 20 20 20 78 21 3d 30 20 26 26 20 64 62 3d  *    x!=0 && db=
1eab0 3d 30 20 20 20 20 20 20 20 53 65 65 64 20 74 68  =0       Seed th
1eac0 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 76 61  e PRNG to the va
1ead0 6c 75 65 20 6f 66 20 78 2e 0a 20 20 20 20 2a 2a  lue of x..    **
1eae0 0a 20 20 20 20 2a 2a 20 20 20 20 78 3d 3d 30 20  .    **    x==0 
1eaf0 26 26 20 64 62 3d 3d 30 20 20 20 20 20 20 20 52  && db==0       R
1eb00 65 76 65 72 74 20 74 6f 20 64 65 66 61 75 6c 74  evert to default
1eb10 20 62 65 68 61 76 69 6f 72 20 6f 66 20 75 73 69   behavior of usi
1eb20 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 20 20  ng the.    **   
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 20 20 20 78 52 61 6e 64 6f 6d 6e 65 73 73       xRandomness
1eb50 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65 20 70   method on the p
1eb60 72 69 6d 61 72 79 20 56 46 53 2e 0a 20 20 20 20  rimary VFS..    
1eb70 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  **.    ** This t
1eb80 65 73 74 2d 63 6f 6e 74 72 6f 6c 20 61 6c 73 6f  est-control also
1eb90 20 72 65 73 65 74 73 20 74 68 65 20 50 52 4e 47   resets the PRNG
1eba0 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77   so that the new
1ebb0 20 73 65 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a   seed will.    *
1ebc0 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  * be used for th
1ebd0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73  e next call to s
1ebe0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1ebf0 73 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  s()..    */.    
1ec00 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1ec10 43 54 52 4c 5f 50 52 4e 47 5f 53 45 45 44 3a 20  CTRL_PRNG_SEED: 
1ec20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
1ec30 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1ec40 0a 20 20 20 20 20 20 69 6e 74 20 79 3b 0a 20 20  .      int y;.  
1ec50 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1ec60 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
1ec70 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 61 73  ite3*);.      as
1ec80 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 64  sert( db==0 || d
1ec90 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
1eca0 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  a!=0 );.      if
1ecb0 28 20 64 62 20 26 26 20 28 79 20 3d 20 64 62 2d  ( db && (y = db-
1ecc0 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[0].pSchema-
1ecd0 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 21  >schema_cookie)!
1ece0 3d 30 20 29 7b 20 78 20 3d 20 79 3b 20 7d 0a 20  =0 ){ x = y; }. 
1ecf0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 66       sqlite3Conf
1ed00 69 67 2e 69 50 72 6e 67 53 65 65 64 20 3d 20 78  ig.iPrngSeed = x
1ed10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1ed20 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b  randomness(0,0);
1ed30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ed40 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1ed50 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1ed60 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f  _control(BITVEC_
1ed70 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67  TEST, size, prog
1ed80 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ram).    **.    
1ed90 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67  ** Run a test ag
1eda0 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f  ainst a Bitvec o
1edb0 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20  bject of size.  
1edc0 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75  The program argu
1edd0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61  ment.    ** is a
1ede0 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  n array of integ
1edf0 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73  ers that defines
1ee00 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75   the test.  Retu
1ee10 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a  rn -1 on a.    *
1ee20 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
1ee30 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20  ion error, 0 on 
1ee40 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d  success, or non-
1ee50 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f  zero for an erro
1ee60 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68  r..    ** See th
1ee70 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  e sqlite3BitvecB
1ee80 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72  uiltinTest() for
1ee90 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1eea0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
1eeb0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1eec0 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f  TESTCTRL_BITVEC_
1eed0 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEST: {.      in
1eee0 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
1eef0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
1ef00 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72  t *aProg = va_ar
1ef10 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
1ef20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1ef30 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
1ef40 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20  (sz, aProg);.   
1ef50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ef60 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1ef70 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1ef80 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41  trol(FAULT_INSTA
1ef90 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20  LL, xCallback). 
1efa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72     **.    ** Arr
1efb0 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  ange to invoke x
1efc0 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65  Callback() whene
1efd0 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74  ver sqlite3Fault
1efe0 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  Sim() is called,
1eff0 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c  .    ** if xCall
1f000 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  back is not NULL
1f010 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f020 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68 65  As a test of the
1f030 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72   fault simulator
1f040 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c   mechanism itsel
1f050 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  f, sqlite3FaultS
1f060 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20  im(0).    ** is 
1f070 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65  called immediate
1f080 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c  ly after install
1f090 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c  ing the new call
1f0a0 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74  back and the ret
1f0b0 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  urn.    ** value
1f0c0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75   from sqlite3Fau
1f0d0 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73  ltSim(0) becomes
1f0e0 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
1f0f0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
1f100 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a  test_control()..
1f110 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1f120 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f130 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b  FAULT_INSTALL: {
1f140 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69  .      /* MSVC i
1f150 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75  s picky about pu
1f160 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20  lling func ptrs 
1f170 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20  from va lists.. 
1f180 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73       ** http://s
1f190 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74  upport.microsoft
1f1a0 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20  .com/kb/47961.  
1f1b0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c      ** sqlite3Gl
1f1c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74  obalConfig.xTest
1f1d0 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72  Callback = va_ar
1f1e0 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74  g(ap, int(*)(int
1f1f0 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
1f200 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a     typedef int(*
1f210 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1f220 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20  _t)(int);.      
1f230 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1f240 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
1f250 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54  k = va_arg(ap, T
1f260 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f  ESTCALLBACKFUNC_
1f270 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
1f280 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1f290 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f2a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1f2b0 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1f2c0 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47  st_control(BENIG
1f2d0 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20  N_MALLOC_HOOKS, 
1f2e0 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20  xBegin, xEnd).  
1f2f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69    **.    ** Regi
1f300 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61  ster hooks to ca
1f310 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ll to indicate w
1f320 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61  hich malloc() fa
1f330 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61  ilures .    ** a
1f340 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a  re benign..    *
1f350 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1f360 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47  E_TESTCTRL_BENIG
1f370 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20  N_MALLOC_HOOKS: 
1f380 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  {.      typedef 
1f390 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63  void (*void_func
1f3a0 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20  tion)(void);.   
1f3b0 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
1f3c0 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20   xBenignBegin;. 
1f3d0 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
1f3e0 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20  on xBenignEnd;. 
1f3f0 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69       xBenignBegi
1f400 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  n = va_arg(ap, v
1f410 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
1f420 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20       xBenignEnd 
1f430 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1f440 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
1f450 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e     sqlite3Benign
1f460 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e  MallocHooks(xBen
1f470 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67  ignBegin, xBenig
1f480 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65  nEnd);.      bre
1f490 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1f4a0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1f4b0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1f4c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1f4d0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73  ENDING_BYTE, uns
1f4e0 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20  igned int X).   
1f4f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1f500 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
1f510 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
1f520 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66  the argument, if
1f530 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b   X>0..    ** Mak
1f540 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
1f550 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68  X==0.  Return th
1f560 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70  e value of the p
1f570 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20  ending byte.    
1f580 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e  ** as it existin
1f590 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  g before this ro
1f5a0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1f5b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f5c0 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e  IMPORTANT:  Chan
1f5d0 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1f5e0 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30   byte from 0x400
1f5f0 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e  00000 results in
1f600 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d  .    ** an incom
1f610 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65  patible database
1f620 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43   file format.  C
1f630 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
1f640 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ING byte.    ** 
1f650 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61  while any databa
1f660 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
1f670 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e   open results in
1f680 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20   undefined and. 
1f690 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75     ** deleteriou
1f6a0 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20  s behavior..    
1f6b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f6c0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1f6d0 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20  ING_BYTE: {.    
1f6e0 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42    rc = PENDING_B
1f6f0 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  YTE;.#ifndef SQL
1f700 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20  ITE_OMIT_WSD.   
1f710 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73     {.        uns
1f720 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c  igned int newVal
1f730 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
1f740 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
1f750 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20       if( newVal 
1f760 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67  ) sqlite3Pending
1f770 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20  Byte = newVal;. 
1f780 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1f790 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f7a0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1f7b0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f7c0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1f7d0 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e  TCTRL_ASSERT, in
1f7e0 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1f7f0 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
1f800 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
1f810 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77  me test to see w
1f820 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20  hether or not.  
1f830 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61    ** assert() wa
1f840 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
1f850 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58  pile-time.  If X
1f860 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73   is true and ass
1f870 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  ert().    ** is 
1f880 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
1f890 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1f8a0 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73  s true.  If X is
1f8b0 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a   true and.    **
1f8c0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1f8d0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1f8e0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1f8f0 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20  zero.  If X is. 
1f900 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20     ** false and 
1f910 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
1f920 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73  led, then the as
1f930 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e  sertion fires an
1f940 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  d the.    ** pro
1f950 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66  cess aborts.  If
1f960 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20   X is false and 
1f970 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
1f980 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  bled, then the. 
1f990 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c     ** return val
1f9a0 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20  ue is zero..    
1f9b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f9c0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1f9d0 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61  RT: {.      vola
1f9e0 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a  tile int x = 0;.
1f9f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2f 2a        assert( /*
1fa00 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b 2a  side-effects-ok*
1fa10 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70  / (x = va_arg(ap
1fa20 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20  ,int))!=0 );.   
1fa30 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20     rc = x;.     
1fa40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
1fa50 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1fa60 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1fa70 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1fa80 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20  TRL_ALWAYS, int 
1fa90 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1faa0 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
1fab0 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
1fac0 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77   test to see how
1fad0 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a   the ALWAYS and.
1fae0 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63      ** NEVER mac
1faf0 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ros were defined
1fb00 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1fb10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1fb20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1fb30 20 69 73 20 41 4c 57 41 59 53 28 58 29 20 69 66   is ALWAYS(X) if
1fb40 20 58 20 69 73 20 74 72 75 65 2c 20 6f 72 20 30   X is true, or 0
1fb50 20 69 66 20 58 20 69 73 20 66 61 6c 73 65 2e 0a   if X is false..
1fb60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1fb70 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65  e recommended te
1fb80 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20  st is X==2.  If 
1fb90 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1fba0 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e   is 2, that mean
1fbb0 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28  s.    ** ALWAYS(
1fbc0 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1fbd0 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73  e both no-op pas
1fbe0 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
1fbf0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20  , which is the. 
1fc00 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65     ** default se
1fc10 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  tting.  If the r
1fc20 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
1fc30 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20  , then ALWAYS() 
1fc40 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  is either.    **
1fc50 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74   hard-coded to t
1fc60 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61  rue or else it a
1fc70 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72  sserts if its ar
1fc80 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e  gument is false.
1fc90 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
1fca0 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64  t behavior (hard
1fcb0 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20  -coded to true) 
1fcc0 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
1fcd0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
1fce0 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
1fcf0 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
1fd00 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64   is disabled and
1fd10 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
1fd20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73  ** behavior (ass
1fd30 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ert if the argum
1fd40 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20  ent to ALWAYS() 
1fd50 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65  is false) is the
1fd60 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1fd70 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fd80 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1fd90 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  t assert() is en
1fda0 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  abled..    **.  
1fdb0 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d    ** The run-tim
1fdc0 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
1fdd0 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
1fde0 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
1fdf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fe00 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
1fe10 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1fe20 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1fe30 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20  S, 2)==2 ){.    
1fe40 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1fe50 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1fe60 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  are no-op pass-t
1fe70 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20  hrough macros.  
1fe80 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66    **    }else if
1fe90 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
1fea0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1feb0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31  STCTRL_ASSERT, 1
1fec0 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  ) ){.    **     
1fed0 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73   // ALWAYS(x) as
1fee0 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20  serts that x is 
1fef0 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61  true. NEVER(x) a
1ff00 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73  sserts x is fals
1ff10 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  e..    **    }el
1ff20 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se{.    **      
1ff30 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20  // ALWAYS(x) is 
1ff40 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e  a constant 1.  N
1ff50 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e  EVER(x) is a con
1ff60 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20  stant 0..    ** 
1ff70 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
1ff80 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1ff90 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20  CTRL_ALWAYS: {. 
1ffa0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1ffb0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1ffc0 20 20 20 72 63 20 3d 20 78 20 3f 20 41 4c 57 41     rc = x ? ALWA
1ffd0 59 53 28 78 29 20 3a 20 30 3b 0a 20 20 20 20 20  YS(x) : 0;.     
1ffe0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1fff0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73     /*.    **   s
20000 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
20010 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
20020 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a  TRL_BYTEORDER);.
20030 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
20040 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e  e integer return
20050 65 64 20 72 65 76 65 61 6c 73 20 74 68 65 20 62  ed reveals the b
20060 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65  yte-order of the
20070 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69   computer on whi
20080 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65  ch.    ** SQLite
20090 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20   is running:.   
200a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
200b0 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61   1     big-endia
200c0 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64  n,    determined
200d0 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20   at run-time.   
200e0 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20 20   **      10     
200f0 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64  little-endian, d
20100 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e  etermined at run
20110 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33  -time.    **  43
20120 32 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64  2101     big-end
20130 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
20140 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
20150 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31  me.    **  12341
20160 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64  0     little-end
20170 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20  ian, determined 
20180 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
20190 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65      */ .    case
201a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
201b0 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20  _BYTEORDER: {.  
201c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
201d0 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20  BYTEORDER*100 + 
201e0 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44  SQLITE_LITTLEEND
201f0 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f  IAN*10 + SQLITE_
20200 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20  BIGENDIAN;.     
20210 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20220 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
20230 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
20240 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
20250 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64  ERVE, sqlite3 *d
20260 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a  b, int N).    **
20270 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
20280 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f  nReserve size to
20290 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20   N for the main 
202a0 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20  database on the 
202b0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
202c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20  connection db.. 
202d0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
202e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
202f0 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20  ESERVE: {.      
20300 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
20310 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
20320 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  *);.      int x 
20330 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
20340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
20350 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
20360 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71  mutex);.      sq
20370 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
20380 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d  eSize(db->aDb[0]
20390 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a  .pBt, 0, x, 0);.
203a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
203b0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
203c0 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tex);.      brea
203d0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
203e0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
203f0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
20400 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
20410 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64  IONS, sqlite3 *d
20420 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a  b, int N).    **
20430 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f  .    ** Enable o
20440 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75  r disable variou
20450 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
20460 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
20470 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20  oses.  The .    
20480 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73  ** argument N is
20490 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70   a bitmask of op
204a0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62  timizations to b
204b0 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72  e disabled.  For
204c0 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f   normal.    ** o
204d0 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c  peration N shoul
204e0 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64 65  d be 0.  The ide
204f0 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73 74  a is that a test
20500 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74   program (like t
20510 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f  he.    ** SQL Lo
20520 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20  gic Test or SLT 
20530 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e  test module) can
20540 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51   run the same SQ
20550 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  L multiple times
20560 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72  .    ** with var
20570 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
20580 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76  ns disabled to v
20590 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73  erify that the s
205a0 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a  ame answer.    *
205b0 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e  * is obtained in
205c0 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20   every case..   
205d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
205e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
205f0 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20  IMIZATIONS: {.  
20600 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
20610 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
20620 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
20630 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28  ->dbOptFlags = (
20640 75 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20  u16)(va_arg(ap, 
20650 69 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a  int) & 0xffff);.
20660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20670 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
20680 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
20690 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
206a0 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
206b0 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20  T, int onoff);. 
206c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
206d0 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20  parameter onoff 
206e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 75 62  is non-zero, sub
206f0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
20700 20 6c 6f 63 61 6c 74 69 6d 65 28 29 0a 20 20 20   localtime().   
20710 20 2a 2a 20 61 6e 64 20 69 74 73 20 76 61 72 69   ** and its vari
20720 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e  ants fail. If on
20730 6f 66 66 20 69 73 20 7a 65 72 6f 2c 20 75 6e 64  off is zero, und
20740 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a  o this setting..
20750 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
20760 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20770 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
20780 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
20790 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f  GlobalConfig.bLo
207a0 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76  caltimeFault = v
207b0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
207c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
207d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
207e0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
207f0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
20800 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 53  L_INTERNAL_FUNCS
20810 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20  , int onoff);.  
20820 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
20830 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69  arameter onoff i
20840 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 6e 74 65  s non-zero, inte
20850 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 53 51  rnal-use-only SQ
20860 4c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  L functions.    
20870 2a 2a 20 61 72 65 20 76 69 73 69 62 6c 65 20 74  ** are visible t
20880 6f 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 2e 20  o ordinary SQL. 
20890 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
208a0 66 6f 72 20 74 65 73 74 69 6e 67 20 62 75 74 20  for testing but 
208b0 69 73 0a 20 20 20 20 2a 2a 20 75 6e 73 61 66 65  is.    ** unsafe
208c0 20 62 65 63 61 75 73 65 20 69 6e 76 61 6c 69 64   because invalid
208d0 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
208e0 68 6f 73 65 20 69 6e 74 65 72 6e 61 6c 2d 75 73  hose internal-us
208f0 65 2d 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 73  e-only functions
20900 0a 20 20 20 20 2a 2a 20 63 61 6e 20 72 65 73 75  .    ** can resu
20910 6c 74 20 69 6e 20 63 72 61 73 68 65 73 20 6f 72  lt in crashes or
20920 20 73 65 67 66 61 75 6c 74 73 2e 0a 20 20 20 20   segfaults..    
20930 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
20940 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54 45  TE_TESTCTRL_INTE
20950 52 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 53 3a 20  RNAL_FUNCTIONS: 
20960 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
20970 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 49 6e 74  lobalConfig.bInt
20980 65 72 6e 61 6c 46 75 6e 63 74 69 6f 6e 73 20 3d  ernalFunctions =
20990 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
209a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
209b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
209c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
209d0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
209e0 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
209f0 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a  T, int);.    **.
20a00 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c      ** Set or cl
20a10 65 61 72 20 61 20 66 6c 61 67 20 74 68 61 74 20  ear a flag that 
20a20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
20a30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20a40 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d   is always well-
20a50 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61  .    ** formed a
20a60 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74  nd never corrupt
20a70 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20  .  This flag is 
20a80 63 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c 74  clear by default
20a90 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
20aa0 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  t.    ** databas
20ab0 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61  e files might ha
20ac0 76 65 20 61 72 62 69 74 72 61 72 79 20 63 6f 72  ve arbitrary cor
20ad0 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e  ruption.  Settin
20ae0 67 20 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e  g the flag durin
20af0 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67  g.    ** testing
20b00 20 63 61 75 73 65 73 20 63 65 72 74 61 69 6e 20   causes certain 
20b10 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
20b20 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20  nts in the code 
20b30 74 6f 20 62 65 20 61 63 74 69 76 61 74 65 64 0a  to be activated.
20b40 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f      ** that demo
20b50 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74  nstrat invariant
20b60 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  s on well-formed
20b70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
20b80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
20b90 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
20ba0 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20  _NEVER_CORRUPT: 
20bb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
20bc0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65  lobalConfig.neve
20bd0 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72  rCorrupt = va_ar
20be0 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
20bf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20c00 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
20c10 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
20c20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58  LITE_TESTCTRL_EX
20c30 54 52 41 5f 53 43 48 45 4d 41 5f 43 48 45 43 4b  TRA_SCHEMA_CHECK
20c40 53 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a  S, int);.    **.
20c50 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c      ** Set or cl
20c60 65 61 72 20 61 20 66 6c 61 67 20 74 68 61 74 20  ear a flag that 
20c70 63 61 75 73 65 73 20 53 51 4c 69 74 65 20 74 6f  causes SQLite to
20c80 20 76 65 72 69 66 79 20 74 68 61 74 20 74 79 70   verify that typ
20c90 65 2c 20 6e 61 6d 65 2c 0a 20 20 20 20 2a 2a 20  e, name,.    ** 
20ca0 61 6e 64 20 74 62 6c 5f 6e 61 6d 65 20 66 69 65  and tbl_name fie
20cb0 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  lds of the sqlit
20cc0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
20cd0 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
20ce0 79 0a 20 20 20 20 2a 2a 20 6f 6e 2c 20 62 75 74  y.    ** on, but
20cf0 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
20d00 20 75 73 65 66 75 6c 20 74 6f 20 74 75 72 6e 20   useful to turn 
20d10 69 74 20 6f 66 66 20 66 6f 72 20 74 65 73 74 69  it off for testi
20d20 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ng..    */.    c
20d30 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
20d40 54 52 4c 5f 45 58 54 52 41 5f 53 43 48 45 4d 41  TRL_EXTRA_SCHEMA
20d50 5f 43 48 45 43 4b 53 3a 20 7b 0a 20 20 20 20 20  _CHECKS: {.     
20d60 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20d70 6e 66 69 67 2e 62 45 78 74 72 61 53 63 68 65 6d  nfig.bExtraSchem
20d80 61 43 68 65 63 6b 73 20 3d 20 76 61 5f 61 72 67  aChecks = va_arg
20d90 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
20da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20db0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 74 68     /* Set the th
20dc0 72 65 73 68 6f 6c 64 20 61 74 20 77 68 69 63 68  reshold at which
20dd0 20 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e 74 65 72   OP_Once counter
20de0 73 20 72 65 73 65 74 20 62 61 63 6b 20 74 6f 20  s reset back to 
20df0 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 20 42 79 20  zero..    ** By 
20e00 64 65 66 61 75 6c 74 20 74 68 69 73 20 69 73 20  default this is 
20e10 30 78 37 66 66 66 66 66 66 65 20 28 6f 76 65 72  0x7ffffffe (over
20e20 20 32 20 62 69 6c 6c 69 6f 6e 29 2c 20 62 75 74   2 billion), but
20e30 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 0a 20   that value is. 
20e40 20 20 20 2a 2a 20 74 6f 6f 20 62 69 67 20 74 6f     ** too big to
20e50 20 74 65 73 74 20 69 6e 20 61 20 72 65 61 73 6f   test in a reaso
20e60 6e 61 62 6c 65 20 61 6d 6f 75 6e 74 20 6f 66 20  nable amount of 
20e70 74 69 6d 65 2c 20 73 6f 20 74 68 69 73 20 63 6f  time, so this co
20e80 6e 74 72 6f 6c 20 69 73 0a 20 20 20 20 2a 2a 20  ntrol is.    ** 
20e90 70 72 6f 76 69 64 65 64 20 74 6f 20 73 65 74 20  provided to set 
20ea0 61 20 73 6d 61 6c 6c 20 61 6e 64 20 65 61 73 69  a small and easi
20eb0 6c 79 20 72 65 61 63 68 61 62 6c 65 20 72 65 73  ly reachable res
20ec0 65 74 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f  et value..    */
20ed0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20ee0 5f 54 45 53 54 43 54 52 4c 5f 4f 4e 43 45 5f 52  _TESTCTRL_ONCE_R
20ef0 45 53 45 54 5f 54 48 52 45 53 48 4f 4c 44 3a 20  ESET_THRESHOLD: 
20f00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
20f10 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63  lobalConfig.iOnc
20f20 65 52 65 73 65 74 54 68 72 65 73 68 6f 6c 64 20  eResetThreshold 
20f30 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
20f40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20f50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
20f60 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
20f70 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
20f80 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41  CTRL_VDBE_COVERA
20f90 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  GE, xCallback, p
20fa0 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tr);.    **.    
20fb0 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20  ** Set the VDBE 
20fc0 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63  coverage callbac
20fd0 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43  k function to xC
20fe0 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e  allback with con
20ff0 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69  text .    ** poi
21000 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f  nter ptr..    */
21010 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
21020 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
21030 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65  OVERAGE: {.#ifde
21040 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
21050 56 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70  VERAGE.      typ
21060 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e  edef void (*bran
21070 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69  ch_callback)(voi
21080 64 2a 2c 75 6e 73 69 67 6e 65 64 20 69 6e 74 2c  d*,unsigned int,
21090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
210c0 63 68 61 72 2c 75 6e 73 69 67 6e 65 64 20 63 68  char,unsigned ch
210d0 61 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ar);.      sqlit
210e0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
210f0 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f  VdbeBranch = va_
21100 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61  arg(ap,branch_ca
21110 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73  llback);.      s
21120 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21130 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72  ig.pVdbeBranchAr
21140 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f  g = va_arg(ap,vo
21150 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  id*);.#endif.   
21160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21170 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
21180 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
21190 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
211a0 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20  ORTER_MMAP, db, 
211b0 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61  nMax); */.    ca
211c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
211d0 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20  RL_SORTER_MMAP: 
211e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
211f0 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
21200 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
21210 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
21220 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
21230 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
21240 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
21250 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
21260 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
21270 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
21280 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
21290 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
212a0 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20  K if SQLite has 
212b0 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
212c0 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f   and SQLITE_ERRO
212d0 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e  R if.    ** not.
212e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
212f0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
21300 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20  _ISINIT: {.     
21310 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
21320 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d  alConfig.isInit=
21330 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
21340 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
21350 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
21360 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
21370 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
21380 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
21390 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f  R, db, dbName, o
213a0 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20  nOff, tnum);.   
213b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
213c0 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20  test control is 
213d0 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 69  used to create i
213e0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20  mposter tables. 
213f0 20 22 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74   "db" is a point
21400 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  er.    ** to the
21410 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21420 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73  tion.  dbName is
21430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
21440 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f  me (ex: "main" o
21450 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29  r.    ** "temp")
21460 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65   which will rece
21470 69 76 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ive the imposter
21480 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73  .  "onOff" turns
21490 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f   imposter mode o
214a0 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e  n.    ** or off.
214b0 20 20 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20    "tnum" is the 
214c0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
214d0 20 62 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68   b-tree to which
214e0 20 74 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20   the imposter.  
214f0 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c    ** table shoul
21500 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a  d connect..    *
21510 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20  *.    ** Enable 
21520 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e  imposter mode on
21530 6c 79 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ly when the sche
21540 6d 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ma has already b
21550 65 65 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65  een parsed.  The
21560 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73  n.    ** run a s
21570 69 6e 67 6c 65 20 43 52 45 41 54 45 20 54 41 42  ingle CREATE TAB
21580 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  LE statement to 
21590 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d  construct the im
215a0 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a  poster table in.
215b0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65      ** the parse
215c0 64 20 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20  d schema.  Then 
215d0 74 75 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f  turn imposter mo
215e0 64 65 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69  de back off agai
215f0 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  n..    **.    **
21600 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64   If onOff==0 and
21610 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73   tnum>0 then res
21620 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  et the schema fo
21630 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c  r all databases,
21640 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20   causing.    ** 
21650 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65  the schema to be
21660 20 72 65 70 61 72 73 65 64 20 74 68 65 20 6e 65   reparsed the ne
21670 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65  xt time it is ne
21680 65 64 65 64 2e 20 20 54 68 69 73 20 68 61 73 20  eded.  This has 
21690 74 68 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63  the.    ** effec
216a0 74 20 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c  t of erasing all
216b0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
216c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
216d0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
216e0 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20  L_IMPOSTER: {.  
216f0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
21700 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
21710 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71  ite3*);.      sq
21720 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
21730 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
21740 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62      db->init.iDb
21750 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
21760 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28  Name(db, va_arg(
21770 61 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  ap,const char*))
21780 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74  ;.      db->init
21790 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  .busy = db->init
217a0 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d  .imposterTable =
217b0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
217c0 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
217d0 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67  newTnum = va_arg
217e0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
217f0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
21800 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  y==0 && db->init
21810 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20  .newTnum>0 ){.  
21820 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
21830 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
21840 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20  nnection(db);.  
21850 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
21860 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
21870 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
21880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
21890 23 69 66 20 64 65 66 69 6e 65 64 28 59 59 43 4f  #if defined(YYCO
218a0 56 45 52 41 47 45 29 0a 20 20 20 20 2f 2a 20 20  VERAGE).    /*  
218b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
218c0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
218d0 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45  CTRL_PARSER_COVE
218e0 52 41 47 45 2c 20 46 49 4c 45 20 2a 6f 75 74 29  RAGE, FILE *out)
218f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
21900 68 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c  his test control
21910 20 28 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65   (only available
21920 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20   when SQLite is 
21930 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20  compiled with.  
21940 20 20 2a 2a 20 2d 44 59 59 43 4f 56 45 52 41 47    ** -DYYCOVERAG
21950 45 29 20 77 72 69 74 65 73 20 61 20 72 65 70 6f  E) writes a repo
21960 72 74 20 6f 6e 74 6f 20 22 6f 75 74 22 20 74 68  rt onto "out" th
21970 61 74 20 73 68 6f 77 73 20 61 6c 6c 0a 20 20 20  at shows all.   
21980 20 2a 2a 20 73 74 61 74 65 2f 6c 6f 6f 6b 61 68   ** state/lookah
21990 65 61 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ead combinations
219a0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73   in the parser s
219b0 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 20 20 20  tate machine.   
219c0 20 2a 2a 20 77 68 69 63 68 20 61 72 65 20 6e 65   ** which are ne
219d0 76 65 72 20 65 78 65 72 63 69 73 65 64 2e 20 20  ver exercised.  
219e0 49 66 20 61 6e 79 20 73 74 61 74 65 20 69 73 20  If any state is 
219f0 6d 69 73 73 65 64 2c 20 6d 61 6b 65 20 74 68 65  missed, make the
21a00 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 63  .    ** return c
21a10 6f 64 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ode SQLITE_ERROR
21a20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
21a30 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
21a40 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47  L_PARSER_COVERAG
21a50 45 3a 20 7b 0a 20 20 20 20 20 20 46 49 4c 45 20  E: {.      FILE 
21a60 2a 6f 75 74 20 3d 20 76 61 5f 61 72 67 28 61 70  *out = va_arg(ap
21a70 2c 20 46 49 4c 45 2a 29 3b 0a 20 20 20 20 20 20  , FILE*);.      
21a80 69 66 28 20 73 71 6c 69 74 65 33 50 61 72 73 65  if( sqlite3Parse
21a90 72 43 6f 76 65 72 61 67 65 28 6f 75 74 29 20 29  rCoverage(out) )
21aa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
21ab0 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
21ac0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
21ad0 20 64 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52   defined(YYCOVER
21ae0 41 47 45 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  AGE) */..    /* 
21af0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
21b00 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
21b10 54 43 54 52 4c 5f 52 45 53 55 4c 54 5f 49 4e 54  TCTRL_RESULT_INT
21b20 52 45 41 4c 2c 20 73 71 6c 69 74 65 33 5f 63 6f  REAL, sqlite3_co
21b30 6e 74 65 78 74 2a 29 3b 0a 20 20 20 20 2a 2a 0a  ntext*);.    **.
21b40 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
21b50 2d 63 6f 6e 74 72 6f 6c 20 63 61 75 73 65 73 20  -control causes 
21b60 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
21b70 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
21b80 6e 74 36 34 28 29 20 76 61 6c 75 65 0a 20 20 20  nt64() value.   
21b90 20 2a 2a 20 74 6f 20 62 65 20 69 6e 74 65 72 70   ** to be interp
21ba0 72 65 74 65 64 20 61 73 20 61 20 4d 45 4d 5f 49  reted as a MEM_I
21bb0 6e 74 52 65 61 6c 20 69 6e 73 74 65 61 64 20 6f  ntReal instead o
21bc0 66 20 61 73 20 61 6e 20 4d 45 4d 5f 49 6e 74 2e  f as an MEM_Int.
21bd0 20 20 4e 6f 72 6d 61 6c 6c 79 2c 0a 20 20 20 20    Normally,.    
21be0 2a 2a 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 76  ** MEM_IntReal v
21bf0 61 6c 75 65 73 20 6f 6e 6c 79 20 61 72 69 73 65  alues only arise
21c00 20 64 75 72 69 6e 67 20 61 6e 20 49 4e 53 45 52   during an INSER
21c10 54 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 69  T operation of i
21c20 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a 20 76 61  nteger.    ** va
21c30 6c 75 65 73 20 69 6e 74 6f 20 61 20 52 45 41 4c  lues into a REAL
21c40 20 63 6f 6c 75 6d 6e 2c 20 73 6f 20 74 68 65 79   column, so they
21c50 20 63 61 6e 20 62 65 20 63 68 61 6c 6c 65 6e 67   can be challeng
21c60 69 6e 67 20 74 6f 20 74 65 73 74 2e 20 20 54 68  ing to test.  Th
21c70 69 73 0a 20 20 20 20 2a 2a 20 74 65 73 74 2d 63  is.    ** test-c
21c80 6f 6e 74 72 6f 6c 20 65 6e 61 62 6c 65 73 20 75  ontrol enables u
21c90 73 20 74 6f 20 77 72 69 74 65 20 61 6e 20 69 6e  s to write an in
21ca0 74 72 65 61 6c 28 29 20 53 51 4c 20 66 75 6e 63  treal() SQL func
21cb0 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 0a 20 20  tion that can.  
21cc0 20 20 2a 2a 20 69 6e 6a 65 63 74 20 61 6e 20 69    ** inject an i
21cd0 6e 74 72 65 61 6c 28 29 20 76 61 6c 75 65 20 61  ntreal() value a
21ce0 74 20 61 72 62 69 74 72 61 72 79 20 70 6c 61 63  t arbitrary plac
21cf0 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 61  es in an SQL sta
21d00 74 65 6d 65 6e 74 2c 0a 20 20 20 20 2a 2a 20 66  tement,.    ** f
21d10 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
21d20 73 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ses..    */.    
21d30 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
21d40 43 54 52 4c 5f 52 45 53 55 4c 54 5f 49 4e 54 52  CTRL_RESULT_INTR
21d50 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
21d60 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
21d70 74 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  tx = va_arg(ap, 
21d80 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
21d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21da0 52 65 73 75 6c 74 49 6e 74 52 65 61 6c 28 70 43  ResultIntReal(pC
21db0 74 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tx);.      break
21dc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
21dd0 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
21de0 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 54 45 53   /* SQLITE_UNTES
21df0 54 41 42 4c 45 20 2a 2f 0a 20 20 72 65 74 75 72  TABLE */.  retur
21e00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
21e10 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
21e20 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
21e30 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
21e40 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
21e50 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
21e60 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
21e70 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
21e80 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
21e90 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
21ea0 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
21eb0 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
21ec0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
21ed0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
21ee0 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
21ef0 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
21f00 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
21f10 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
21f20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
21f30 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
21f40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
21f50 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
21f60 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
21f70 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
21f80 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
21f90 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
21fa0 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
21fb0 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
21fc0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
21fd0 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
21fe0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
21ff0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
22000 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
22010 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
22020 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
22030 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
22040 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
22050 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
22060 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
22070 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
22080 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61  lename==0 || zPa
22090 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ram==0 ) return 
220a0 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  0;.  zFilename +
220b0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
220c0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
220d0 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65  ;.  while( zFile
220e0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
220f0 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46  nt x = strcmp(zF
22100 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
22110 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
22120 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
22130 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
22140 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20  1;.    if( x==0 
22150 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61  ) return zFilena
22160 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  me;.    zFilenam
22170 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
22180 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
22190 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  + 1;.  }.  retur
221a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
221b0 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76  turn a boolean v
221c0 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79  alue for a query
221d0 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69   parameter..*/.i
221e0 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  nt sqlite3_uri_b
221f0 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61  oolean(const cha
22200 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
22210 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
22220 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20  , int bDflt){.  
22230 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
22240 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
22250 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
22260 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c   zParam);.  bDfl
22270 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20  t = bDflt!=0;.  
22280 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74  return z ? sqlit
22290 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20  e3GetBoolean(z, 
222a0 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a  bDflt) : bDflt;.
222b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
222c0 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
222d0 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
222e0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
222f0 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
22300 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34  qlite3_uri_int64
22310 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
22320 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a  zFilename,    /*
22330 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73   Filename as pas
22340 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a  sed to xOpen */.
22350 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
22360 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55  aram,       /* U
22370 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75  RI parameter sou
22380 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ght */.  sqlite3
22390 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20  _int64 bDflt    
223a0 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20     /* return if 
223b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73  parameter is mis
223c0 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  sing */.){.  con
223d0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
223e0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
223f0 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
22400 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  aram);.  sqlite3
22410 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20  _int64 v;.  if( 
22420 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f  z && sqlite3DecO
22430 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29  rHexToI64(z, &v)
22440 3d 3d 30 20 29 7b 0a 20 20 20 20 62 44 66 6c 74  ==0 ){.    bDflt
22450 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = v;.  }.  retu
22460 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  rn bDflt;.}../*.
22470 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74  ** Return the Bt
22480 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e  ree pointer iden
22490 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d  tified by zDbNam
224a0 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
224b0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
224c0 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44  .Btree *sqlite3D
224d0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c  bNameToBtree(sql
224e0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
224f0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
22500 20 20 69 6e 74 20 69 44 62 20 3d 20 7a 44 62 4e    int iDb = zDbN
22510 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 46 69 6e  ame ? sqlite3Fin
22520 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 4e  dDbName(db, zDbN
22530 61 6d 65 29 20 3a 20 30 3b 0a 20 20 72 65 74 75  ame) : 0;.  retu
22540 72 6e 20 69 44 62 3c 30 20 3f 20 30 20 3a 20 64  rn iDb<0 ? 0 : d
22550 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
22560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22570 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66   the filename of
22580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
22590 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
225a0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
225b0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74  ection..*/.const
225c0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64   char *sqlite3_d
225d0 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74  b_filename(sqlit
225e0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
225f0 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
22600 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64  Btree *pBt;.#ifd
22610 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
22620 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
22630 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
22640 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
22650 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
22660 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
22670 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
22680 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c  ndif.  pBt = sql
22690 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
226a0 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
226b0 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73    return pBt ? s
226c0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
226d0 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b  lename(pBt) : 0;
226e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
226f0 20 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69   1 if database i
22700 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30  s read-only or 0
22710 20 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20   if read/write. 
22720 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a   Return -1 if.**
22730 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73   no such databas
22740 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74  e exists..*/.int
22750 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64   sqlite3_db_read
22760 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62  only(sqlite3 *db
22770 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
22780 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20  bName){.  Btree 
22790 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  *pBt;.#ifdef SQL
227a0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
227b0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
227c0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
227d0 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
227e0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
227f0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
22800 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
22810 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44    pBt = sqlite3D
22820 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
22830 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
22840 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
22850 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79  3BtreeIsReadonly
22860 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23  (pBt) : -1;.}..#
22870 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
22880 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a  BLE_SNAPSHOT./*.
22890 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 6e 61 70  ** Obtain a snap
228a0 73 68 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72 20  shot handle for 
228b0 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  the snapshot of 
228c0 64 61 74 61 62 61 73 65 20 7a 44 62 20 63 75 72  database zDb cur
228d0 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67  rently .** being
228e0 20 72 65 61 64 20 62 79 20 68 61 6e 64 6c 65 20   read by handle 
228f0 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
22900 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28  e3_snapshot_get(
22910 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
22920 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22930 44 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  Db,.  sqlite3_sn
22940 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73  apshot **ppSnaps
22950 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  hot.){.  int rc 
22960 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
22970 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22980 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20  MIT_WAL..#ifdef 
22990 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
229a0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
229b0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
229c0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
229d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
229e0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
229f0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
22a00 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
22a10 75 74 65 78 29 3b 0a 0a 20 20 69 66 28 20 64 62  utex);..  if( db
22a20 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
22a30 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  ){.    int iDb =
22a40 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
22a50 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  me(db, zDb);.   
22a60 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69   if( iDb==0 || i
22a70 44 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74  Db>1 ){.      Bt
22a80 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
22a90 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
22aa0 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
22ab0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
22ac0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
22ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
22ae0 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
22af0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
22b00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22b10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
22b20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22b30 53 6e 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69  SnapshotGet(sqli
22b40 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
22b50 74 29 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b  t), ppSnapshot);
22b60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22b70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22b80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
22b90 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
22ba0 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49  #endif   /* SQLI
22bb0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20  TE_OMIT_WAL */. 
22bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22bd0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64  *.** Open a read
22be0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
22bf0 74 68 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65  the snapshot ide
22c00 6e 64 69 66 69 65 64 20 62 79 20 70 53 6e 61 70  ndified by pSnap
22c10 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  shot..*/.int sql
22c20 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  ite3_snapshot_op
22c30 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en(.  sqlite3 *d
22c40 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
22c50 20 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65   *zDb, .  sqlite
22c60 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61  3_snapshot *pSna
22c70 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72  pshot.){.  int r
22c80 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
22c90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22ca0 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65  _OMIT_WAL..#ifde
22cb0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22cc0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
22cd0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
22ce0 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
22cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
22d00 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
22d10 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
22d20 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
22d30 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
22d40 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
22d50 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   ){.    int iDb;
22d60 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
22d70 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
22d80 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69   zDb);.    if( i
22d90 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29  Db==0 || iDb>1 )
22da0 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
22db0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Bt = db->aDb[iDb
22dc0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
22dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
22de0 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29  nTrans(pBt)==0 )
22df0 7b 0a 20 20 20 20 20 20 20 20 50 61 67 65 72 20  {.        Pager 
22e00 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
22e10 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
22e20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 55  ;.        int bU
22e30 6e 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  nlock = 0;.     
22e40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
22e50 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73  reeIsInReadTrans
22e60 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
22e70 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
22e80 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20  Active==0 ){.   
22e90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
22ea0 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
22eb0 6f 74 43 68 65 63 6b 28 70 50 61 67 65 72 2c 20  otCheck(pPager, 
22ec0 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20  pSnapshot);.    
22ed0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22ef0 20 20 20 20 20 20 20 20 20 20 20 62 55 6e 6c 6f             bUnlo
22f00 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
22f10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22f20 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42  e3BtreeCommit(pB
22f30 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
22f40 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
22f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22f60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22f70 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
22f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
22f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22fa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22fb0 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
22fc0 74 4f 70 65 6e 28 70 50 61 67 65 72 2c 20 70 53  tOpen(pPager, pS
22fd0 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
22fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
22ff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23000 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23010 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
23020 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30  nTrans(pBt, 0, 0
23030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
23040 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
23050 74 4f 70 65 6e 28 70 50 61 67 65 72 2c 20 30 29  tOpen(pPager, 0)
23060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23070 20 20 20 20 69 66 28 20 62 55 6e 6c 6f 63 6b 20      if( bUnlock 
23080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23090 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
230a0 74 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  tUnlock(pPager);
230b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
230c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
230d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
230e0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
230f0 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49  #endif   /* SQLI
23100 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20  TE_OMIT_WAL */. 
23110 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23120 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20  *.** Recover as 
23130 6d 61 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61  many snapshots a
23140 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20  s possible from 
23150 74 68 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73  the wal file ass
23160 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
23170 73 63 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61  schema zDb of da
23180 74 61 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e  tabase db..*/.in
23190 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  t sqlite3_snapsh
231a0 6f 74 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74  ot_recover(sqlit
231b0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
231c0 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20  ar *zDb){.  int 
231d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
231e0 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69  R;.  int iDb;.#i
231f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23200 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
23210 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
23220 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
23230 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
23240 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
23250 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
23260 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
23270 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  if..  sqlite3_mu
23280 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
23290 74 65 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  tex);.  iDb = sq
232a0 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
232b0 64 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  db, zDb);.  if( 
232c0 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20  iDb==0 || iDb>1 
232d0 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
232e0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
232f0 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d  .pBt;.    if( 0=
23300 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49  =sqlite3BtreeIsI
23310 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20  nReadTrans(pBt) 
23320 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23330 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
23340 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  rans(pBt, 0, 0);
23350 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
23360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23370 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23380 50 61 67 65 72 53 6e 61 70 73 68 6f 74 52 65 63  PagerSnapshotRec
23390 6f 76 65 72 28 73 71 6c 69 74 65 33 42 74 72 65  over(sqlite3Btre
233a0 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20  ePager(pBt));.  
233b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
233c0 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  eeCommit(pBt);. 
233d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
233e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
233f0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
23400 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
23410 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
23420 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
23430 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
23440 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f  napshot handle o
23450 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
23460 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
23470 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  t()..*/.void sql
23480 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
23490 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  ee(sqlite3_snaps
234a0 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b  hot *pSnapshot){
234b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
234c0 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65  pSnapshot);.}.#e
234d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
234e0 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
234f0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
23500 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
23510 54 49 4f 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a  TION_DIAGS./*.**
23520 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
23530 6f 66 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  of a compile-tim
23540 65 20 6f 70 74 69 6f 6e 2c 20 72 65 74 75 72 6e  e option, return
23550 20 74 72 75 65 20 69 66 20 74 68 61 74 20 6f 70   true if that op
23560 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64  tion.** was used
23570 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
23580 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d  t..**.** The nam
23590 65 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79  e can optionally
235a0 20 62 65 67 69 6e 20 77 69 74 68 20 22 53 51 4c   begin with "SQL
235b0 49 54 45 5f 22 20 62 75 74 20 74 68 65 20 22 53  ITE_" but the "S
235c0 51 4c 49 54 45 5f 22 20 70 72 65 66 69 78 0a 2a  QLITE_" prefix.*
235d0 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  * is not require
235e0 64 20 66 6f 72 20 61 20 6d 61 74 63 68 2e 0a 2a  d for a match..*
235f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
23600 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64  mpileoption_used
23610 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70  (const char *zOp
23620 74 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c  tName){.  int i,
23630 20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a   n;.  int nOpt;.
23640 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
23650 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a 23  zCompileOpt;. .#
23660 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
23670 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
23680 20 7a 4f 70 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zOptName==0 ){.
23690 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
236a0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
236b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
236c0 23 65 6e 64 69 66 0a 0a 20 20 61 7a 43 6f 6d 70  #endif..  azComp
236d0 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  ileOpt = sqlite3
236e0 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26  CompileOptions(&
236f0 6e 4f 70 74 29 3b 0a 0a 20 20 69 66 28 20 73 71  nOpt);..  if( sq
23700 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f  lite3StrNICmp(zO
23710 70 74 4e 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f  ptName, "SQLITE_
23720 22 2c 20 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e  ", 7)==0 ) zOptN
23730 61 6d 65 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20  ame += 7;.  n = 
23740 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
23750 7a 4f 70 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  zOptName);..  /*
23760 20 53 69 6e 63 65 20 6e 4f 70 74 20 69 73 20 6e   Since nOpt is n
23770 6f 72 6d 61 6c 6c 79 20 69 6e 20 73 69 6e 67 6c  ormally in singl
23780 65 20 64 69 67 69 74 73 2c 20 61 20 6c 69 6e 65  e digits, a line
23790 61 72 20 73 65 61 72 63 68 20 69 73 20 0a 20 20  ar search is .  
237a0 2a 2a 20 61 64 65 71 75 61 74 65 2e 20 4e 6f 20  ** adequate. No 
237b0 6e 65 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72  need for a binar
237c0 79 20 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20 66  y search. */.  f
237d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20  or(i=0; i<nOpt; 
237e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
237f0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f  lite3StrNICmp(zO
23800 70 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c  ptName, azCompil
23810 65 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20  eOpt[i], n)==0. 
23820 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
23830 49 64 43 68 61 72 28 28 75 6e 73 69 67 6e 65 64  IdChar((unsigned
23840 20 63 68 61 72 29 61 7a 43 6f 6d 70 69 6c 65 4f   char)azCompileO
23850 70 74 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20  pt[i][n])==0.   
23860 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
23870 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
23880 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
23890 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4e 2d  ** Return the N-
238a0 74 68 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  th compile-time 
238b0 6f 70 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20  option string.  
238c0 49 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  If N is out of r
238d0 61 6e 67 65 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  ange,.** return 
238e0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
238f0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
23900 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
23910 74 69 6f 6e 5f 67 65 74 28 69 6e 74 20 4e 29 7b  tion_get(int N){
23920 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63  .  int nOpt;.  c
23930 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f  onst char **azCo
23940 6d 70 69 6c 65 4f 70 74 3b 0a 20 20 61 7a 43 6f  mpileOpt;.  azCo
23950 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74  mpileOpt = sqlit
23960 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  e3CompileOptions
23970 28 26 6e 4f 70 74 29 3b 0a 20 20 69 66 28 20 4e  (&nOpt);.  if( N
23980 3e 3d 30 20 26 26 20 4e 3c 6e 4f 70 74 20 29 7b  >=0 && N<nOpt ){
23990 0a 20 20 20 20 72 65 74 75 72 6e 20 61 7a 43 6f  .    return azCo
239a0 6d 70 69 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d  mpileOpt[N];.  }
239b0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
239c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
239d0 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
239e0 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a              ON_DIAGS */.