/ Hex Artifact Content
Login

Artifact 5ec5bc48f76ecbf464b2a481e3674c36f0a9ea9fb60e39adae8c7b692206028c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20  ES */..    case 
5de0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4f 46  SQLITE_CONFIG_OF
5df0: 44 5f 4c 4f 43 4b 53 3a 20 7b 0a 20 20 20 20 20  D_LOCKS: {.     
5e00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5e10: 6e 66 69 67 2e 62 4f 66 64 4c 6f 63 6b 73 20 3d  nfig.bOfdLocks =
5e20: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5e30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5e40: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
5e50: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t: {.      rc = 
5e60: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5e80: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
5e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
5eb0: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75  the lookaside bu
5ec0: 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61  ffers for a data
5ed0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
5ee0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
5ef0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
5f00: 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69    .** If lookasi
5f10: 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  de is already ac
5f20: 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  tive, return SQL
5f30: 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20  ITE_BUSY..**.** 
5f40: 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72  The sz parameter
5f50: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
5f60: 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20  f bytes in each 
5f70: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a  lookaside slot..
5f80: 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d  ** The cnt param
5f90: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
5fa0: 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66  er of slots.  If
5fb0: 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20   pStart is NULL 
5fc0: 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72  the.** space for
5fd0: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
5fe0: 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65  emory is obtaine
5ff0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
6000: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70  alloc()..** If p
6010: 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  Start is not NUL
6020: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a  L then it is sz*
6030: 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  cnt bytes of mem
6040: 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a  ory to use for.*
6050: 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  * the lookaside 
6060: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
6070: 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61  c int setupLooka
6080: 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  side(sqlite3 *db
6090: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
60a0: 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  t sz, int cnt){.
60b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
60c0: 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20  MIT_LOOKASIDE.  
60d0: 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20  void *pStart;.  
60e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f  .  if( sqlite3Lo
60f0: 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30  okasideUsed(db,0
6100: 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  )>0 ){.    retur
6110: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
6120: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
6130: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
6140: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
6150: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
6160: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
6170: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
6180: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
6190: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
61a0: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
61b0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
61c0: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
61d0: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
61e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
61f0: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6200: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6210: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
6220: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
6230: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
6240: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
6250: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
6260: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
6270: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
6280: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
6290: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
62a0: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
62b0: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
62c0: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
62d0: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
62e0: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
62f0: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
6300: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
6310: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
6320: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
6330: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
6340: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
6350: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
6360: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
6370: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
6380: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
6390: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
63a0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
63b0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
63c0: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
63d0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
63e0: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
63f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6400: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
6410: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
6420: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
6430: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
6440: 64 65 2e 70 49 6e 69 74 20 3d 20 30 3b 0a 20 20  de.pInit = 0;.  
6450: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
6460: 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c  ree = 0;.  db->l
6470: 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28 75  ookaside.sz = (u
6480: 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53 74  16)sz;.  if( pSt
6490: 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  art ){.    int i
64a0: 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53  ;.    LookasideS
64b0: 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  lot *p;.    asse
64c0: 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73 69  rt( sz > (int)si
64d0: 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  zeof(LookasideSl
64e0: 6f 74 2a 29 20 29 3b 0a 20 20 20 20 64 62 2d 3e  ot*) );.    db->
64f0: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20  lookaside.nSlot 
6500: 3d 20 63 6e 74 3b 0a 20 20 20 20 70 20 3d 20 28  = cnt;.    p = (
6510: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70  LookasideSlot*)p
6520: 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69  Start;.    for(i
6530: 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  =cnt-1; i>=0; i-
6540: 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  -){.      p->pNe
6550: 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  xt = db->lookasi
6560: 64 65 2e 70 49 6e 69 74 3b 0a 20 20 20 20 20 20  de.pInit;.      
6570: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49  db->lookaside.pI
6580: 6e 69 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  nit = p;.      p
6590: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
65a0: 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d  t*)&((u8*)p)[sz]
65b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
65c0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d  lookaside.pEnd =
65d0: 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   p;.    db->look
65e0: 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d  aside.bDisable =
65f0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   0;.    db->look
6600: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
6610: 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a  = pBuf==0 ?1:0;.
6620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
6630: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
6640: 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e  t = db;.    db->
6650: 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d  lookaside.pEnd =
6660: 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   db;.    db->loo
6670: 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
6680: 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 1;.    db->loo
6690: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
66a0: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 0;.    db->lo
66b0: 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d 20  okaside.nSlot = 
66c0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  0;.  }.#endif /*
66d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f   SQLITE_OMIT_LOO
66e0: 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74 75  KASIDE */.  retu
66f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6700: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6710: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
6720: 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
6730: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
6740: 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  /.sqlite3_mutex 
6750: 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65  *sqlite3_db_mute
6760: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  x(sqlite3 *db){.
6770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6780: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
6790: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
67a0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
67b0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
67c0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
67d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
67e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
67f0: 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a  n db->mutex;.}..
6800: 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73  /*.** Free up as
6810: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
6820: 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20  we can from the 
6830: 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a  given database.*
6840: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
6850: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
6860: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73  release_memory(s
6870: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
6880: 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51  nt i;..#ifdef SQ
6890: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
68a0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
68b0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
68c0: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
68d0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
68e0: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
68f0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6900: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
6910: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
6920: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
6930: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
6940: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
6950: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
6960: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
6970: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
6980: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
6990: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
69a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
69b0: 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65  agerShrink(pPage
69c0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
69d0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
69e0: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
69f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6a00: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6a10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
6a30: 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20 69  ny dirty pages i
6a40: 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  n the pager-cach
6a50: 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63 68  e for any attach
6a60: 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ed database.** t
6a70: 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
6a80: 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66  qlite3_db_cachef
6a90: 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64 62  lush(sqlite3 *db
6aa0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
6ab0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6ac0: 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75 73  ;.  int bSeenBus
6ad0: 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  y = 0;..#ifdef S
6ae0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6af0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6b00: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6b10: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6b20: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6b30: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6b40: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6b50: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
6b60: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
6b70: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6b80: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
6b90: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
6ba0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
6bb0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
6bc0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
6bd0: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
6be0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
6bf0: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
6c00: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
6c10: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
6c20: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6c30: 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 70  ite3PagerFlush(p
6c40: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
6c50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
6c60: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65  Y ){.        bSe
6c70: 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20  enBusy = 1;.    
6c80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6c90: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
6ca0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
6cb0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
6cc0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
6cd0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
6ce0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 72  x);.  return ((r
6cf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
6d00: 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51 4c  bSeenBusy) ? SQL
6d10: 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b 0a  ITE_BUSY : rc);.
6d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
6d30: 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20  ration settings 
6d40: 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61  for an individua
6d50: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
6d60: 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ction.*/.int sql
6d70: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73  ite3_db_config(s
6d80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
6d90: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
6da0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
6db0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
6dc0: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
6dd0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
6de0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d  QLITE_DBCONFIG_M
6df0: 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20 20  AINDBNAME: {.   
6e00: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36 38     /* IMP: R-068
6e10: 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20 20  24-28531 */.    
6e20: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32 35    /* IMP: R-3625
6e30: 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20 20 20 20  7-52125 */.     
6e40: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53   db->aDb[0].zDbS
6e50: 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Name = va_arg(ap
6e60: 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 72  ,char*);.      r
6e70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6e80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6e90: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
6ea0: 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  E_DBCONFIG_LOOKA
6eb0: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SIDE: {.      vo
6ec0: 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72  id *pBuf = va_ar
6ed0: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a  g(ap, void*); /*
6ee0: 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30   IMP: R-26835-10
6ef0: 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  964 */.      int
6f00: 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
6f10: 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20   int);       /* 
6f20: 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39  IMP: R-47871-259
6f30: 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  94 */.      int 
6f40: 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  cnt = va_arg(ap,
6f50: 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49   int);      /* I
6f60: 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38  MP: R-04460-5338
6f70: 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  6 */.      rc = 
6f80: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
6f90: 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74  b, pBuf, sz, cnt
6fa0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6fb0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6fc0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  t: {.      stati
6fd0: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
6fe0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b  .        int op;
6ff0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
7000: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  ode */.        u
7010: 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d  32 mask;    /* M
7020: 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69  ask of the bit i
7030: 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20  n sqlite3.flags 
7040: 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a  to set/clear */.
7050: 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b        } aFlagOp[
7060: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
7070: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
7080: 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20  ENABLE_FKEY,    
7090: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 6f         SQLITE_Fo
70a0: 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a  reignKeys    },.
70b0: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
70c0: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
70d0: 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20 20 20  _TRIGGER,       
70e0: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72   SQLITE_EnableTr
70f0: 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20  igger  },.      
7100: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
7110: 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  FIG_ENABLE_FTS3_
7120: 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54  TOKENIZER, SQLIT
7130: 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20  E_Fts3Tokenizer 
7140: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
7150: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
7160: 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
7170: 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64  ION, SQLITE_Load
7180: 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20  Extension  },.  
7190: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
71a0: 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f  BCONFIG_NO_CKPT_
71b0: 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 53  ON_CLOSE,      S
71c0: 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c  QLITE_NoCkptOnCl
71d0: 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  ose  },.        
71e0: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
71f0: 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20 20  G_ENABLE_QPSG,  
7200: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
7210: 45 6e 61 62 6c 65 51 50 53 47 20 20 20 20 20 7d  EnableQPSG     }
7220: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
7230: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47  TE_DBCONFIG_TRIG
7240: 47 45 52 5f 45 51 50 2c 20 20 20 20 20 20 20 20  GER_EQP,        
7250: 20 20 20 53 51 4c 49 54 45 5f 54 72 69 67 67 65     SQLITE_Trigge
7260: 72 45 51 50 20 20 20 20 20 7d 2c 0a 20 20 20 20  rEQP     },.    
7270: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
7280: 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54 41  ONFIG_RESET_DATA
7290: 42 41 53 45 2c 20 20 20 20 20 20 20 20 53 51 4c  BASE,        SQL
72a0: 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73  ITE_ResetDatabas
72b0: 65 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20  e  },.      };. 
72c0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
72d0: 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t i;.      rc = 
72e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
72f0: 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33   IMP: R-42790-23
7300: 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  372 */.      for
7310: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
7320: 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29  e(aFlagOp); i++)
7330: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  {.        if( aF
7340: 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20  lagOp[i].op==op 
7350: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
7360: 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28   onoff = va_arg(
7370: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
7380: 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20      int *pRes = 
7390: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
73a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  ;.          u32 
73b0: 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  oldFlags = db->f
73c0: 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
73d0: 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20  if( onoff>0 ){. 
73e0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66             db->f
73f0: 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b  lags |= aFlagOp[
7400: 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  i].mask;.       
7410: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f     }else if( ono
7420: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
7430: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
7440: 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  = ~aFlagOp[i].ma
7450: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sk;.          }.
7460: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c            if( ol
7470: 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67  dFlags!=db->flag
7480: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
7490: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
74a0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
74b0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
74c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
74d0: 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pRes ){.        
74e0: 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d      *pRes = (db-
74f0: 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70  >flags & aFlagOp
7500: 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  [i].mask)!=0;.  
7510: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7520: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7530: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OK;.          br
7540: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
7550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7560: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7570: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
7580: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
7590: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
75a0: 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30  f the buffer z[0
75b0: 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20  ..n-1] contains 
75c0: 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73  all spaces..*/.s
75d0: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61  tatic int allSpa
75e0: 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ces(const char *
75f0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69  z, int n){.  whi
7600: 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31  le( n>0 && z[n-1
7610: 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]==' ' ){ n--; }
7620: 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a  .  return n==0;.
7630: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
7640: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
7650: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
7660: 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77  named "BINARY" w
7670: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a  hich is always.*
7680: 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  * available..**.
7690: 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61  ** If the padFla
76a0: 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  g argument is no
76b0: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63  t NULL then spac
76c0: 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65  e padding at the
76d0: 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e   end.** of strin
76e0: 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  gs is ignored.  
76f0: 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20  This implements 
7700: 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74  the RTRIM collat
7710: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
7720: 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a  nt binCollFunc(.
7730: 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c    void *padFlag,
7740: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
7750: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
7760: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
7770: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
7780: 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a  ){.  int rc, n;.
7790: 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79    n = nKey1<nKey
77a0: 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79  2 ? nKey1 : nKey
77b0: 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  2;.  /* EVIDENCE
77c0: 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34  -OF: R-65033-284
77d0: 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20  49 The built-in 
77e0: 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e  BINARY collation
77f0: 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73   compares.  ** s
7800: 74 72 69 6e 67 73 20 62 79 74 65 20 62 79 20 62  trings byte by b
7810: 79 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65  yte using the me
7820: 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20  mcmp() function 
7830: 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
7840: 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79  d C.  ** library
7850: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
7860: 4b 65 79 31 20 26 26 20 70 4b 65 79 32 20 29 3b  Key1 && pKey2 );
7870: 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70  .  rc = memcmp(p
7880: 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b  Key1, pKey2, n);
7890: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
78a0: 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a      if( padFlag.
78b0: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
78c0: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29  s(((char*)pKey1)
78d0: 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20  +n, nKey1-n).   
78e0: 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28    && allSpaces((
78f0: 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c  (char*)pKey2)+n,
7900: 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b   nKey2-n).    ){
7910: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
7920: 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32  CE-OF: R-31624-2
7930: 34 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69  4737 RTRIM is li
7940: 6b 65 20 42 49 4e 41 52 59 20 65 78 63 65 70 74  ke BINARY except
7950: 20 74 68 61 74 20 65 78 74 72 61 0a 20 20 20 20   that extra.    
7960: 20 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74    ** spaces at t
7970: 68 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72  he end of either
7980: 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63   string do not c
7990: 68 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74  hange the result
79a0: 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20  . In other.     
79b0: 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e   ** words, strin
79c0: 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20  gs will compare 
79d0: 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f  equal to one ano
79e0: 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20  ther as long as 
79f0: 74 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69  they.      ** di
7a00: 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65  ffer only in the
7a10: 20 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65   number of space
7a20: 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20  s at the end..  
7a30: 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65      */.    }else
7a40: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65  {.      rc = nKe
7a50: 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20  y1 - nKey2;.    
7a60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
7a70: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74  c;.}../*.** Anot
7a80: 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c  her built-in col
7a90: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a  lating sequence:
7aa0: 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20   NOCASE. .**.** 
7ab0: 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73  This collating s
7ac0: 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e  equence is inten
7ad0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66  ded to be used f
7ae0: 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e  or "case indepen
7af0: 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73  dent.** comparis
7b00: 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e  on". SQLite's kn
7b10: 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72  owledge of upper
7b20: 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20   and lower case 
7b30: 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65  equivalents.** e
7b40: 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74  xtends only to t
7b50: 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73  he 26 characters
7b60: 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67   used in the Eng
7b70: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a  lish language..*
7b80: 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65  *.** At the mome
7b90: 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  nt there is only
7ba0: 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65   a UTF-8 impleme
7bb0: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
7bc0: 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c  ic int nocaseCol
7bd0: 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f  latingFunc(.  vo
7be0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
7bf0: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
7c00: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
7c10: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
7c20: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
7c30: 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33   int r = sqlite3
7c40: 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20  StrNICmp(.      
7c50: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b  (const char *)pK
7c60: 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ey1, (const char
7c70: 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31   *)pKey2, (nKey1
7c80: 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b  <nKey2)?nKey1:nK
7c90: 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ey2);.  UNUSED_P
7ca0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
7cb0: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b  );.  if( 0==r ){
7cc0: 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e  .    r = nKey1-n
7cd0: 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key2;.  }.  retu
7ce0: 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn r;.}../*.** R
7cf0: 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20  eturn the ROWID 
7d00: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
7d10: 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c  nt insert.*/.sql
7d20: 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  ite_int64 sqlite
7d30: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
7d40: 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29  wid(sqlite3 *db)
7d50: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
7d60: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
7d70: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
7d80: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
7d90: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
7da0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
7db0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7dc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
7dd0: 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  urn db->lastRowi
7de0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  d;.}../*.** Set 
7df0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
7e00: 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
7e10: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
7e20: 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69  wid() API functi
7e30: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
7e40: 74 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e 73  te3_set_last_ins
7e50: 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65  ert_rowid(sqlite
7e60: 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 69  3 *db, sqlite3_i
7e70: 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23 69  nt64 iRowid){.#i
7e80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7e90: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7ea0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7eb0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7ec0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7ed0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7ee0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
7ef0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
7f00: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
7f10: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61 73  utex);.  db->las
7f20: 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  tRowid = iRowid;
7f30: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7f40: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
7f50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
7f60: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
7f70: 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   changes in the 
7f80: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
7f90: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
7fa0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
7fb0: 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74  e3_changes(sqlit
7fc0: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
7fd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
7fe0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
7ff0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
8000: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
8010: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
8020: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
8030: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
8040: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  f.  return db->n
8050: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
8060: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8070: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69  er of changes si
8080: 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nce the database
8090: 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e   handle was open
80a0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
80b0: 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
80c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
80d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
80e0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
80f0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
8100: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
8110: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
8120: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
8130: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8140: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
8150: 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
8160: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  e;.}../*.** Clos
8170: 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  e all open savep
8180: 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63  oints. This func
8190: 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75  tion only manipu
81a0: 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20  lates fields of 
81b0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
81c0: 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69  handle object, i
81d0: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65  t does not close
81e0: 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20   any savepoints 
81f0: 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e  that may be open
8200: 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65  .** at the b-tre
8210: 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a  e/pager level..*
8220: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
8230: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71  oseSavepoints(sq
8240: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68  lite3 *db){.  wh
8250: 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f  ile( db->pSavepo
8260: 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70  int ){.    Savep
8270: 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d  oint *pTmp = db-
8280: 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20  >pSavepoint;.   
8290: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
82a0: 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20  = pTmp->pNext;. 
82b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
82c0: 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a  (db, pTmp);.  }.
82d0: 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
82e0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61   = 0;.  db->nSta
82f0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62  tement = 0;.  db
8300: 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
8310: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a  avepoint = 0;.}.
8320: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
8330: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e  e destructor fun
8340: 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ction associated
8350: 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c   with FuncDef p,
8360: 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c   if any. Except,
8370: 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e  .** if this is n
8380: 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79  ot the last copy
8390: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
83a0: 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  , do not invoke 
83b0: 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20  it. Multiple.** 
83c0: 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67  copies of a sing
83d0: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  le function are 
83e0: 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65  created when cre
83f0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69  ate_function() i
8400: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68  s called.** with
8410: 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74   SQLITE_ANY as t
8420: 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a  he encoding..*/.
8430: 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63  static void func
8440: 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69  tionDestroy(sqli
8450: 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66  te3 *db, FuncDef
8460: 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74   *p){.  FuncDest
8470: 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63  ructor *pDestruc
8480: 74 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73 74  tor = p->u.pDest
8490: 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44  ructor;.  if( pD
84a0: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
84b0: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
84c0: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44  ef--;.    if( pD
84d0: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d  estructor->nRef=
84e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73  =0 ){.      pDes
84f0: 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f  tructor->xDestro
8500: 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70  y(pDestructor->p
8510: 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20  UserData);.     
8520: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8530: 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  b, pDestructor);
8540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
8550: 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61  .** Disconnect a
8560: 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ll sqlite3_vtab 
8570: 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c  objects that bel
8580: 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ong to database 
8590: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62  connection.** db
85a0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
85b0: 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e   when db is bein
85c0: 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  g closed..*/.sta
85d0: 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e  tic void disconn
85e0: 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74  ectAllVtab(sqlit
85f0: 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66  e3 *db){.#ifndef
8600: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
8610: 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20  TUALTABLE.  int 
8620: 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  i;.  HashElem *p
8630: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
8640: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
8650: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
8660: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63  Db; i++){.    Sc
8670: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
8680: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65  db->aDb[i].pSche
8690: 6d 61 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ma;.    if( db->
86a0: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[i].pSchema )
86b0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71  {.      for(p=sq
86c0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
86d0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
86e0: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
86f0: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20  hNext(p)){.     
8700: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
8710: 20 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65   (Table *)sqlite
8720: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
8730: 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
8740: 61 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74  al(pTab) ) sqlit
8750: 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74  e3VtabDisconnect
8760: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
8770: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8780: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
8790: 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75  First(&db->aModu
87a0: 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  le); p; p=sqlite
87b0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
87c0: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d    Module *pMod =
87d0: 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74   (Module *)sqlit
87e0: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
87f0: 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f    if( pMod->pEpo
8800: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
8810: 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65  ite3VtabDisconne
8820: 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70  ct(db, pMod->pEp
8830: 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oTab);.    }.  }
8840: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
8850: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20  lockList(db);.  
8860: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
8870: 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a  eAll(db);.#else.
8880: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8890: 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d  ER(db);.#endif.}
88a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
88b0: 52 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20  RUE if database 
88c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
88d0: 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72  s unfinalized pr
88e0: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
88f0: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
8900: 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ed sqlite3_backu
8910: 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a  p objects.  .*/.
8920: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65  static int conne
8930: 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69  ctionIsBusy(sqli
8940: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
8950: 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  j;.  assert( sql
8960: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8970: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
8980: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20  if( db->pVdbe ) 
8990: 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28  return 1;.  for(
89a0: 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20  j=0; j<db->nDb; 
89b0: 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  j++){.    Btree 
89c0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a  *pBt = db->aDb[j
89d0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
89e0: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
89f0: 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74  eeIsInBackup(pBt
8a00: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
8a10: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
8a20: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
8a30: 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20  existing SQLite 
8a40: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74  database.*/.stat
8a50: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c  ic int sqlite3Cl
8a60: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ose(sqlite3 *db,
8a70: 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65   int forceZombie
8a80: 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  ){.  if( !db ){.
8a90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
8aa0: 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37 34  OF: R-63257-1174
8ab0: 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  0 Calling sqlite
8ac0: 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20  3_close() or.   
8ad0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   ** sqlite3_clos
8ae0: 65 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e 55  e_v2() with a NU
8af0: 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75 6d  LL pointer argum
8b00: 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ent is a harmles
8b10: 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20  s no-op. */.    
8b20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8b30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
8b40: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
8b50: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
8b60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8b70: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
8b80: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
8b90: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
8ba0: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54  x);.  if( db->mT
8bb0: 72 61 63 65 20 26 20 53 51 4c 49 54 45 5f 54 52  race & SQLITE_TR
8bc0: 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20 20  ACE_CLOSE ){.   
8bd0: 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c 49   db->xTrace(SQLI
8be0: 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 2c 20  TE_TRACE_CLOSE, 
8bf0: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 64  db->pTraceArg, d
8c00: 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b, 0);.  }..  /*
8c10: 20 46 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e 65   Force xDisconne
8c20: 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20  ct calls on all 
8c30: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a  virtual tables *
8c40: 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  /.  disconnectAl
8c50: 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a  lVtab(db);..  /*
8c60: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
8c70: 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 64  n is open, the d
8c80: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
8c90: 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20  () call above.  
8ca0: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65  ** will not have
8cb0: 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73   called the xDis
8cc0: 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64  connect() method
8cd0: 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a   on any virtual.
8ce0: 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74    ** tables in t
8cf0: 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d  he db->aVTrans[]
8d00: 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c   array. The foll
8d10: 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61  owing sqlite3Vta
8d20: 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a  bRollback().  **
8d30: 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f   call will do so
8d40: 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20  . We need to do 
8d50: 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65 20  this before the 
8d60: 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65  check for active
8d70: 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
8d80: 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74  ents below, as t
8d90: 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65  he v-table imple
8da0: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65  mentation may be
8db0: 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f   storing.  ** so
8dc0: 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  me prepared stat
8dd0: 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c  ements internall
8de0: 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
8df0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
8e00: 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20  );..  /* Legacy 
8e10: 62 65 68 61 76 69 6f 72 20 28 73 71 6c 69 74 65  behavior (sqlite
8e20: 33 5f 63 6c 6f 73 65 28 29 20 62 65 68 61 76 69  3_close() behavi
8e30: 6f 72 29 20 69 73 20 74 6f 20 72 65 74 75 72 6e  or) is to return
8e40: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  .  ** SQLITE_BUS
8e50: 59 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  Y if the connect
8e60: 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20 63  ion can not be c
8e70: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
8e80: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 66  y..  */.  if( !f
8e90: 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f  orceZombie && co
8ea0: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64  nnectionIsBusy(d
8eb0: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
8ec0: 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
8ed0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22  , SQLITE_BUSY, "
8ee0: 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20  unable to close 
8ef0: 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a  due to unfinaliz
8f00: 65 64 20 22 0a 20 20 20 20 20 20 20 22 73 74 61  ed ".       "sta
8f10: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
8f20: 69 73 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b  ished backups");
8f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
8f40: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8f50: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ex);.    return 
8f60: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
8f70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8f80: 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
8f90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
8fa0: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
8fb0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e  ){.    /* Closin
8fc0: 67 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f  g the handle. Fo
8fd0: 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  urth parameter i
8fe0: 73 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c  s passed the val
8ff0: 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ue 2. */.    sql
9000: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
9010: 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33  .xSqllog(sqlite3
9020: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
9030: 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20  llogArg, db, 0, 
9040: 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  2);.  }.#endif..
9050: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
9060: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f   connection into
9070: 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68   a zombie and th
9080: 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a  en close it..  *
9090: 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  /.  db->magic = 
90a0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
90b0: 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65  BIE;.  sqlite3Le
90c0: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
90d0: 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65  Zombie(db);.  re
90e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
90f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72  }../*.** Two var
9100: 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70  iations on the p
9110: 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20  ublic interface 
9120: 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61  for closing a da
9130: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
9140: 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65  tion. The sqlite
9150: 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f  3_close() versio
9160: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
9170: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61  _BUSY and.** lea
9180: 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ves the connecti
9190: 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65  on option if the
91a0: 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a  re are unfinaliz
91b0: 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ed prepared.** s
91c0: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
91d0: 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f  inished sqlite3_
91e0: 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71  backups.  The sq
91f0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
9200: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63  .** version forc
9210: 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  es the connectio
9220: 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f  n to become a zo
9230: 6d 62 69 65 20 69 66 20 74 68 65 72 65 20 61 72  mbie if there ar
9240: 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65  e.** unclosed re
9250: 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72  sources, and arr
9260: 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f  anges for deallo
9270: 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  cation when the 
9280: 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20  last.** prepare 
9290: 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c  statement or sql
92a0: 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73  ite3_backup clos
92b0: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
92c0: 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33  e3_close(sqlite3
92d0: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
92e0: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29  lite3Close(db,0)
92f0: 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ; }.int sqlite3_
9300: 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33  close_v2(sqlite3
9310: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
9320: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29  lite3Close(db,1)
9330: 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ; }.../*.** Clos
9340: 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  e the mutex on d
9350: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9360: 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72  on db..**.** Fur
9370: 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74  thermore, if dat
9380: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9390: 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20   db is a zombie 
93a0: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68  (meaning that th
93b0: 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ere.** has been 
93c0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
93d0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
93e0: 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ) or sqlite3_clo
93f0: 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a  se_v2(db)) and.*
9400: 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f  * every sqlite3_
9410: 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65  stmt has now bee
9420: 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
9430: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61  every sqlite3_ba
9440: 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69  ckup has.** fini
9450: 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20  shed, then free 
9460: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  all resources..*
9470: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65  /.void sqlite3Le
9480: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
9490: 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a  Zombie(sqlite3 *
94a0: 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  db){.  HashElem 
94b0: 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *i;             
94c0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
94d0: 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f  able iterator */
94e0: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
94f0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
9500: 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33  standing sqlite3
9510: 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33  _stmt or sqlite3
9520: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a  _backup objects.
9530: 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63    ** or if the c
9540: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f  onnection has no
9550: 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65  t yet been close
9560: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d by sqlite3_clo
9570: 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68  se_v2(),.  ** th
9580: 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68  en just leave th
9590: 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75  e mutex and retu
95a0: 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  rn..  */.  if( d
95b0: 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45  b->magic!=SQLITE
95c0: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c  _MAGIC_ZOMBIE ||
95d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
95e0: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
95f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9600: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
9610: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
9620: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
9630: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
9640: 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ans that the dat
9650: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9660: 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64   has.  ** closed
9670: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d   all sqlite3_stm
9680: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61  t and sqlite3_ba
9690: 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64  ckup objects and
96a0: 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70   has been.  ** p
96b0: 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
96c0: 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20  _close (meaning 
96d0: 74 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d  that it is a zom
96e0: 62 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65  bie).  Therefore
96f0: 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20  ,.  ** go ahead 
9700: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73  and free all res
9710: 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20  ources..  */..  
9720: 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  /* If a transact
9730: 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c  ion is open, rol
9740: 6c 20 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20  l it back. This 
9750: 61 6c 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61  also ensures tha
9760: 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61  t if.  ** any da
9770: 74 61 62 61 73 65 20 73 63 68 65 6d 61 73 20 68  tabase schemas h
9780: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
9790: 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74  d by an uncommit
97a0: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ted transaction.
97b0: 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65    ** they are re
97c0: 73 65 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68  set. And that th
97d0: 65 20 72 65 71 75 69 72 65 64 20 62 2d 74 72 65  e required b-tre
97e0: 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20  e mutex is held 
97f0: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65  to make.  ** the
9800: 20 70 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20   pager rollback 
9810: 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74  and schema reset
9820: 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61   an atomic opera
9830: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  tion. */.  sqlit
9840: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
9850: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20  , SQLITE_OK);.. 
9860: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74   /* Free any out
9870: 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69  standing Savepoi
9880: 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a  nt structures. *
9890: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  /.  sqlite3Close
98a0: 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
98b0: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
98c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
98d0: 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d  ions */.  for(j=
98e0: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
98f0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
9900: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
9910: 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[j];.    if( pD
9920: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
9930: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
9940: 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pDb->pBt);.   
9950: 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b     pDb->pBt = 0;
9960: 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20  .      if( j!=1 
9970: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
9980: 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  pSchema = 0;.   
9990: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
99a0: 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45   /* Clear the TE
99b0: 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61 72 61  MP schema separa
99c0: 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f  tely and last */
99d0: 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
99e0: 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
99f0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
9a00: 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ear(db->aDb[1].p
9a10: 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73  Schema);.  }.  s
9a20: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
9a30: 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  List(db);..  /* 
9a40: 46 72 65 65 20 75 70 20 74 68 65 20 61 72 72 61  Free up the arra
9a50: 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64  y of auxiliary d
9a60: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71  atabases */.  sq
9a70: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
9a80: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
9a90: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44    assert( db->nD
9aa0: 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  b<=2 );.  assert
9ab0: 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61  ( db->aDb==db->a
9ac0: 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f  DbStatic );..  /
9ad0: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20  * Tell the code 
9ae0: 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74  in notify.c that
9af0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9b00: 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20  no longer holds 
9b10: 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61  any.  ** locks a
9b20: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  nd does not requ
9b30: 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20  ire any further 
9b40: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
9b50: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
9b60: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
9b70: 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20  nClosed(db);..  
9b80: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
9b90: 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63  First(&db->aFunc
9ba0: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
9bb0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
9bc0: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
9bd0: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
9be0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
9bf0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66 75 6e     do{.      fun
9c00: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
9c10: 20 70 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74   p);.      pNext
9c20: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
9c30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9c40: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  (db, p);.      p
9c50: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 77   = pNext;.    }w
9c60: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a 20  hile( p );.  }. 
9c70: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
9c80: 72 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a 20  r(&db->aFunc);. 
9c90: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9ca0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
9cb0: 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69  lSeq); i; i=sqli
9cc0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9cd0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9ce0: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
9cf0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9d00: 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  );.    /* Invoke
9d10: 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73   any destructors
9d20: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
9d30: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9d40: 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f  ce user data. */
9d50: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
9d60: 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  3; j++){.      i
9d70: 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c  f( pColl[j].xDel
9d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
9d90: 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b  l[j].xDel(pColl[
9da0: 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  j].pUser);.     
9db0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
9dc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9dd0: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Coll);.  }.  sql
9de0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
9df0: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
9e00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9e10: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
9e20: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9e30: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
9e40: 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ule); i; i=sqlit
9e50: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
9e60: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
9e70: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
9e80: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
9e90: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65     if( pMod->xDe
9ea0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70  stroy ){.      p
9eb0: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d  Mod->xDestroy(pM
9ec0: 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  od->pAux);.    }
9ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
9ee0: 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c  EponymousTableCl
9ef0: 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ear(db, pMod);. 
9f00: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9f10: 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a  (db, pMod);.  }.
9f20: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
9f30: 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  ar(&db->aModule)
9f40: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
9f50: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
9f60: 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c  ITE_OK); /* Deal
9f70: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
9f80: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
9f90: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61  . */.  sqlite3Va
9fa0: 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72  lueFree(db->pErr
9fb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  );.  sqlite3Clos
9fc0: 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  eExtensions(db);
9fd0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
9fe0: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
9ff0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
a000: 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65  b->auth.zAuthUse
a010: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
a020: 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74  ee(db->auth.zAut
a030: 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  hPW);.#endif..  
a040: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
a050: 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a  TE_MAGIC_ERROR;.
a060: 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64  .  /* The temp-d
a070: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69  atabase schema i
a080: 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66  s allocated diff
a090: 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65  erently from the
a0a0: 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20   other schema.  
a0b0: 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e  ** objects (usin
a0c0: 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  g sqliteMalloc()
a0d0: 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
a0e0: 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ad of sqlite3Btr
a0f0: 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a  eeSchema())..  *
a100: 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  * So it needs to
a110: 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20   be freed here. 
a120: 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f  Todo: Why not ro
a130: 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65  ll the temp sche
a140: 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  ma into.  ** the
a150: 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c   same sqliteMall
a160: 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20  oc() as the one 
a170: 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74  that allocates t
a180: 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a  he database .  *
a190: 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a  * structure?.  *
a1a0: 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
a1b0: 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d  e(db, db->aDb[1]
a1c0: 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  .pSchema);.  sql
a1d0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a1e0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
a1f0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
a200: 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a  E_MAGIC_CLOSED;.
a210: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a220: 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  free(db->mutex);
a230: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a240: 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28  e3LookasideUsed(
a250: 64 62 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 69 66  db,0)==0 );.  if
a260: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
a270: 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  bMalloced ){.   
a280: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a290: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
a2a0: 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rt);.  }.  sqlit
a2b0: 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a  e3_free(db);.}..
a2c0: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
a2d0: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
a2e0: 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20  s.  If tripCode 
a2f0: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
a300: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72  , then.** any wr
a310: 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
a320: 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72  invalidated ("tr
a330: 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22  ipped" - as in "
a340: 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75  tripping a circu
a350: 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20  it.** breaker") 
a360: 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75  and made to retu
a370: 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74  rn tripCode if t
a380: 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72  here are any fur
a390: 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73  ther.** attempts
a3a0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72   to use that cur
a3b0: 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f  sor.  Read curso
a3c0: 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61  rs remain open a
a3d0: 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20  nd valid.** but 
a3e0: 61 72 65 20 22 73 61 76 65 64 22 20 69 6e 20 63  are "saved" in c
a3f0: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 70 61  ase the table pa
a400: 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72  ges are moved ar
a410: 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ound..*/.void sq
a420: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
a430: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
a440: 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
a450: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72  nt i;.  int inTr
a460: 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ans = 0;.  int s
a470: 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61  chemaChange;.  a
a480: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a490: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
a4a0: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
a4b0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
a4c0: 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61  oc();..  /* Obta
a4d0: 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75  in all b-tree mu
a4e0: 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b  texes before mak
a4f0: 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  ing any calls to
a500: 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
a510: 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  . .  ** This is 
a520: 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73  important in cas
a530: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
a540: 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  n being rolled b
a550: 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64  ack has.  ** mod
a560: 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
a570: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68  se schema. If th
a580: 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  e b-tree mutexes
a590: 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20   are not taken. 
a5a0: 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61   ** here, then a
a5b0: 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61  nother shared-ca
a5c0: 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  che connection m
a5d0: 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65  ight sneak in be
a5e0: 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64  tween.  ** the d
a5f0: 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b  atabase rollback
a600: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
a610: 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75  t, which can cau
a620: 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f  se false.  ** co
a630: 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73  rruption reports
a640: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20   in some cases. 
a650: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
a660: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
a670: 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d    schemaChange =
a680: 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26   (db->mDbFlags &
a690: 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
a6a0: 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62 2d 3e  ange)!=0 && db->
a6b0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20  init.busy==0;.. 
a6c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
a6d0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
a6e0: 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44  tree *p = db->aD
a6f0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
a700: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( p ){.      if(
a710: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
a720: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
a730: 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31       inTrans = 1
a740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a750: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
a760: 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65  back(p, tripCode
a770: 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29  , !schemaChange)
a780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
a790: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
a7a0: 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  k(db);.  sqlite3
a7b0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
a7c0: 29 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d  );..  if( (db->m
a7d0: 44 62 46 6c 61 67 73 26 44 42 46 4c 41 47 5f 53  DbFlags&DBFLAG_S
a7e0: 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30 20  chemaChange)!=0 
a7f0: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  && db->init.busy
a800: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
a810: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
a820: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
a830: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
a840: 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
a850: 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a  ection(db);.  }.
a860: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
a870: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f  aveAll(db);..  /
a880: 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63  * Any deferred c
a890: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
a8a0: 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65  ions have now be
a8b0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
a8c0: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
a8d0: 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  ons = 0;.  db->n
a8e0: 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
a8f0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  = 0;.  db->flags
a900: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
a910: 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  rFKs;..  /* If o
a920: 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ne has been conf
a930: 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74  igured, invoke t
a940: 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b  he rollback-hook
a950: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
a960: 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  f( db->xRollback
a970: 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54  Callback && (inT
a980: 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74  rans || !db->aut
a990: 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20  oCommit) ){.    
a9a0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
a9b0: 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62  lback(db->pRollb
a9c0: 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  ackArg);.  }.}..
a9d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
a9e0: 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e  tatic string con
a9f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
aa00: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
aa10: 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  o the error code
aa20: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e  .** specified in
aa30: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
aa40: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
aa50: 4c 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41  LITE_NEED_ERR_NA
aa60: 4d 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  ME).const char *
aa70: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69  sqlite3ErrName(i
aa80: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
aa90: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
aaa0: 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63  .  int i, origRc
aab0: 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30   = rc;.  for(i=0
aac0: 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d  ; i<2 && zName==
aad0: 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78  0; i++, rc &= 0x
aae0: 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ff){.    switch(
aaf0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73   rc ){.      cas
ab00: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
ab20: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22  me = "SQLITE_OK"
ab30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ab50: 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a  se SQLITE_ERROR:
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
ab70: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52  ame = "SQLITE_ER
ab80: 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROR";           
ab90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aba0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
abb0: 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  NAL:           z
abc0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
abd0: 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20  NTERNAL";       
abe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
abf0: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d  case SQLITE_PERM
ac00: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
ac10: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ac20: 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20  PERM";          
ac30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ac40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
ac50: 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RT:             
ac60: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ac70: 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20  _ABORT";        
ac80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
aca0: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20  ORT_ROLLBACK:   
acb0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
acc0: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
acd0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
ace0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
acf0: 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  USY:            
ad00: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad10: 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20  TE_BUSY";       
ad20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ad30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ad40: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20  BUSY_RECOVERY:  
ad50: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ad60: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
ad70: 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  Y";     break;. 
ad80: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ad90: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20  _BUSY_SNAPSHOT: 
ada0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
adb0: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
adc0: 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OT";     break;.
add0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ade0: 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20  E_LOCKED:       
adf0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ae00: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20  QLITE_LOCKED";  
ae10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ae20: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ae30: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
ae40: 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22  CACHE: zName = "
ae50: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
ae60: 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b  AREDCACHE";break
ae70: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ae80: 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ITE_NOMEM:      
ae90: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aea0: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20  "SQLITE_NOMEM"; 
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
aec0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aed0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20  LITE_READONLY:  
aee0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
aef0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
af00: 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  Y";          bre
af10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
af20: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
af30: 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20  ECOVERY:  zName 
af40: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
af50: 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72  LY_RECOVERY"; br
af60: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
af70: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
af80: 43 41 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65  CANTINIT:  zName
af90: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
afa0: 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62  NLY_CANTINIT"; b
afb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
afc0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
afd0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d  _ROLLBACK:  zNam
afe0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
aff0: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  ONLY_ROLLBACK"; 
b000: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b010: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
b020: 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61  Y_DBMOVED:   zNa
b030: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
b040: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20  DONLY_DBMOVED"; 
b050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b060: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
b070: 4c 59 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e  LY_DIRECTORY: zN
b080: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
b090: 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59  ADONLY_DIRECTORY
b0a0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
b0b0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
b0c0: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a  RUPT:          z
b0d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b0e0: 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20  NTERRUPT";      
b0f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b100: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b110: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
b120: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b130: 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20  IOERR";         
b140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b150: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b160: 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20  RR_READ:        
b170: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b180: 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20  _IOERR_READ";   
b190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b1a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b1b0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
b1c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b1d0: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
b1e0: 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AD";  break;.   
b1f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b200: 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20  OERR_WRITE:     
b210: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b220: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
b230: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b240: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b250: 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20  IOERR_FSYNC:    
b260: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b270: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22  ITE_IOERR_FSYNC"
b280: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b290: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b2a0: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
b2b0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
b2c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
b2d0: 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SYNC";   break;.
b2e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b2f0: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
b300: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
b310: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
b320: 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b  CATE";    break;
b330: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b340: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20  TE_IOERR_FSTAT: 
b350: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b360: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
b370: 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  AT";       break
b380: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b390: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
b3a0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b3b0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  "SQLITE_IOERR_UN
b3c0: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
b3d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b3e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
b3f0: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
b400: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
b410: 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  DLOCK";      bre
b420: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b430: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b440: 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  TE:       zName 
b450: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b460: 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72  DELETE";      br
b470: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b480: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
b490: 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  EM:        zName
b4a0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b4b0: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62  _NOMEM";       b
b4c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b4d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
b4e0: 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d  CESS:       zNam
b4f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b500: 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20  R_ACCESS";      
b510: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b520: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
b530: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
b540: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b570: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b580: 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61  ERVEDLOCK"; brea
b590: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b5a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a  LITE_IOERR_LOCK:
b5b0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b5c0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c   "SQLITE_IOERR_L
b5d0: 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  OCK";        bre
b5e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b5f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
b600: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
b610: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b620: 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72  CLOSE";       br
b630: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b640: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b650: 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65  _CLOSE:    zName
b660: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b670: 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62  _DIR_CLOSE";   b
b680: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b690: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b6a0: 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d  MOPEN:      zNam
b6b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b6c0: 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20  R_SHMOPEN";     
b6d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b6e0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b6f0: 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61  HMSIZE:      zNa
b700: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b710: 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20  RR_SHMSIZE";    
b720: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b730: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b740: 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e  SHMLOCK:      zN
b750: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b760: 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20  ERR_SHMLOCK";   
b770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b780: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b790: 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a  _SHMMAP:       z
b7a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b7b0: 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20  OERR_SHMMAP";   
b7c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b7d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b7e0: 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20  R_SEEK:         
b7f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b800: 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20  IOERR_SEEK";    
b810: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b820: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b830: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a  RR_DELETE_NOENT:
b840: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b850: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
b860: 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ENT";break;.    
b870: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b880: 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20  ERR_MMAP:       
b890: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b8a0: 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20  E_IOERR_MMAP";  
b8b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b8c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b8d0: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
b8e0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
b8f0: 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
b900: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
b910: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b920: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20  IOERR_CONVPATH: 
b930: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b940: 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
b950: 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TH";    break;. 
b960: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b970: 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20  _CORRUPT:       
b980: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b990: 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20  LITE_CORRUPT";  
b9a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b9b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b9c0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20  E_CORRUPT_VTAB: 
b9d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b9e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
b9f0: 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AB";      break;
ba00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ba10: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20  TE_NOTFOUND:    
ba20: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ba30: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22  SQLITE_NOTFOUND"
ba40: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
ba50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ba60: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
ba70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ba80: 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20  "SQLITE_FULL";  
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
baa0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bab0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
bac0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bad0: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
bae0: 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  N";          bre
baf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb00: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
bb10: 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20  OTEMPDIR: zName 
bb20: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
bb30: 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72  EN_NOTEMPDIR";br
bb40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bb50: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bb60: 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65  ISDIR:     zName
bb70: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
bb80: 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62  PEN_ISDIR";    b
bb90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bba0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bbb0: 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d  _FULLPATH:  zNam
bbc0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bbd0: 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20  OPEN_FULLPATH"; 
bbe0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bbf0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
bc00: 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61  N_CONVPATH:  zNa
bc10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
bc20: 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b  TOPEN_CONVPATH";
bc30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bc40: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
bc50: 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  OL:           zN
bc60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52  ame = "SQLITE_PR
bc70: 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20  OTOCOL";        
bc80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bc90: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
bca0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
bcb0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
bcc0: 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20  MPTY";          
bcd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bce0: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
bcf0: 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  MA:             
bd00: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd10: 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20  SCHEMA";        
bd20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bd30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
bd40: 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  BIG:            
bd50: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bd60: 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20  _TOOBIG";       
bd70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bd80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bd90: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
bda0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bdb0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20  E_CONSTRAINT";  
bdc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bdd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bde0: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
bdf0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
be00: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
be10: 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  IQUE"; break;.  
be20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
be30: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
be40: 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  ER: zName = "SQL
be50: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
be60: 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20  RIGGER";break;. 
be70: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
be80: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
be90: 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  IGNKEY:.        
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bec0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
bed0: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20  NT_FOREIGNKEY"; 
bee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bef0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bf00: 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a  RAINT_CHECK:   z
bf10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bf20: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22  ONSTRAINT_CHECK"
bf30: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
bf40: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bf50: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
bf60: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bf90: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
bfa0: 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65  IMARYKEY";   bre
bfb0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bfc0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bfd0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20  _NOTNULL: zName 
bfe0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bff0: 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72  AINT_NOTNULL";br
c000: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c010: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c020: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20  T_COMMITHOOK:.  
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c050: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c060: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
c070: 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OOK";   break;. 
c080: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c090: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
c0a0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
c0b0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c0c0: 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a  VTAB";   break;.
c0d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c0e0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
c0f0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20  CTION:.         
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c120: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c130: 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20  T_FUNCTION";    
c140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c150: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c160: 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e  AINT_ROWID:   zN
c170: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c180: 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b  NSTRAINT_ROWID";
c190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c1a0: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  ase SQLITE_MISMA
c1b0: 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a  TCH:           z
c1c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
c1d0: 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20  ISMATCH";       
c1e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c1f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55  case SQLITE_MISU
c200: 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SE:             
c210: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c220: 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20  MISUSE";        
c230: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c240: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c   case SQLITE_NOL
c250: 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  FS:             
c260: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c270: 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20  _NOLFS";        
c280: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c290: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55    case SQLITE_AU
c2a0: 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TH:             
c2b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c2c0: 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20  E_AUTH";        
c2d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c2e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
c2f0: 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20  ORMAT:          
c300: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c310: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
c320: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c330: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c340: 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20  RANGE:          
c350: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c360: 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20  ITE_RANGE";     
c370: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c380: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c390: 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20  _NOTADB:        
c3a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c3b0: 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20  LITE_NOTADB";   
c3c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c3d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c3e0: 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20  E_ROW:          
c3f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c400: 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20  QLITE_ROW";     
c410: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c420: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c430: 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20  TE_NOTICE:      
c440: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c450: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20  SQLITE_NOTICE"; 
c460: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c470: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c480: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
c490: 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20  ER_WAL: zName = 
c4a0: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
c4b0: 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61  ECOVER_WAL";brea
c4c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c4d0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c4e0: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20  VER_ROLLBACK:.  
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c510: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c520: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
c530: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
c540: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c550: 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20  _WARNING:       
c560: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c570: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20  LITE_WARNING";  
c580: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c590: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c5a0: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
c5b0: 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  DEX:  zName = "S
c5c0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
c5d0: 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  TOINDEX"; break;
c5e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c5f0: 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20  TE_DONE:        
c600: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c610: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20  SQLITE_DONE";   
c620: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c630: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c640: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
c650: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42    static char zB
c660: 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69  uf[50];.    sqli
c670: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
c680: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
c690: 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e   "SQLITE_UNKNOWN
c6a0: 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a  (%d)", origRc);.
c6b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66      zName = zBuf
c6c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
c6d0: 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
c6e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
c6f0: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
c700: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
c710: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
c720: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
c730: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
c740: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
c750: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
c760: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
c770: 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73   char* const aMs
c780: 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53  g[] = {.    /* S
c790: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
c7a0: 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72    */ "not an err
c7b0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c7c0: 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a  TE_ERROR       *
c7d0: 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72  / "SQL logic err
c7e0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c7f0: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
c800: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
c810: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
c820: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
c830: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
c840: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
c850: 54 20 20 20 20 20 20 20 2a 2f 20 22 71 75 65 72  T       */ "quer
c860: 79 20 61 62 6f 72 74 65 64 22 2c 0a 20 20 20 20  y aborted",.    
c870: 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20  /* SQLITE_BUSY  
c880: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
c890: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  se is locked",. 
c8a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43     /* SQLITE_LOC
c8b0: 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74  KED      */ "dat
c8c0: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
c8d0: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
c8e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20  QLITE_NOMEM     
c8f0: 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d    */ "out of mem
c900: 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ory",.    /* SQL
c910: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  ITE_READONLY    
c920: 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  */ "attempt to w
c930: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
c940: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
c950: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  * SQLITE_INTERRU
c960: 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75  PT   */ "interru
c970: 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  pted",.    /* SQ
c980: 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20  LITE_IOERR      
c990: 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72   */ "disk I/O er
c9a0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c9b0: 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20  ITE_CORRUPT     
c9c0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73  */ "database dis
c9d0: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
c9e0: 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rmed",.    /* SQ
c9f0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  LITE_NOTFOUND   
ca00: 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65   */ "unknown ope
ca10: 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20  ration",.    /* 
ca20: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20  SQLITE_FULL     
ca30: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
ca40: 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22  or disk is full"
ca50: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
ca60: 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22  CANTOPEN    */ "
ca70: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
ca80: 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20  atabase file",. 
ca90: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f     /* SQLITE_PRO
caa0: 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63  TOCOL    */ "loc
cab0: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a  king protocol",.
cac0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d      /* SQLITE_EM
cad0: 50 54 59 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  PTY       */ 0,.
cae0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43      /* SQLITE_SC
caf0: 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61  HEMA      */ "da
cb00: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
cb10: 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20  s changed",.    
cb20: 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  /* SQLITE_TOOBIG
cb30: 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67        */ "string
cb40: 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67   or blob too big
cb50: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cb60: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20  _CONSTRAINT  */ 
cb70: 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  "constraint fail
cb80: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cb90: 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a  TE_MISMATCH    *
cba0: 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d  / "datatype mism
cbb0: 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51  atch",.    /* SQ
cbc0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20  LITE_MISUSE     
cbd0: 20 2a 2f 20 22 62 61 64 20 70 61 72 61 6d 65 74   */ "bad paramet
cbe0: 65 72 20 6f 72 20 6f 74 68 65 72 20 41 50 49 20  er or other API 
cbf0: 6d 69 73 75 73 65 22 2c 0a 23 69 66 64 65 66 20  misuse",.#ifdef 
cc00: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
cc10: 46 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  FS.    /* SQLITE
cc20: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
cc30: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
cc40: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
cc50: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53  ,.#else.    /* S
cc60: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
cc70: 20 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20    */ 0,.#endif. 
cc80: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54     /* SQLITE_AUT
cc90: 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74  H        */ "aut
cca0: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
ccb0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
ccc0: 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f  E_FORMAT      */
ccd0: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
cce0: 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f  E_RANGE       */
ccf0: 20 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f   "column index o
cd00: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
cd10: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
cd20: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
cd30: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
cd40: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
cd50: 54 45 5f 4e 4f 54 49 43 45 20 20 20 20 20 20 2a  TE_NOTICE      *
cd60: 2f 20 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20  / "notification 
cd70: 6d 65 73 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a  message",.    /*
cd80: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20   SQLITE_WARNING 
cd90: 20 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20      */ "warning 
cda0: 6d 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20  message",.  };. 
cdb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
cdc0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
cdd0: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
cde0: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
cdf0: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
ce00: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
ce10: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
ce20: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
ce30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ce40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ce50: 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ROW: {.      zEr
ce60: 72 20 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f 77  r = "another row
ce70: 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20   available";.   
ce80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ce90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
cea0: 44 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45  DONE: {.      zE
ceb0: 72 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f  rr = "no more ro
cec0: 77 73 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20  ws available";. 
ced0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cee0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
cef0: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
cf00: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
cf10: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
cf20: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
cf30: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
cf40: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
cf50: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
cf60: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
cf70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
cf80: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
cf90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cfa0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
cfb0: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
cfc0: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
cfd0: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
cfe0: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
cff0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
d000: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
d010: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
d020: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d030: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
d040: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
d050: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
d060: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
d070: 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 6c 6f   to retry the lo
d080: 63 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ck.  Return zero
d090: 20 74 6f 20 73 74 6f 70 20 74 72 79 69 6e 67 0a   to stop trying.
d0a0: 2a 2a 20 61 6e 64 20 63 61 75 73 65 20 53 51 4c  ** and cause SQL
d0b0: 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ite to return SQ
d0c0: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74  LITE_BUSY..*/.st
d0d0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
d0e0: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
d0f0: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c  ck(.  void *ptr,
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d110: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d120: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63  ction */.  int c
d130: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
d140: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d150: 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73   times table has
d160: 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   been busy */.  
d170: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
d180: 69 6c 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ile      /* The 
d190: 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68  file on which th
d1a0: 65 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64 20  e lock occurred 
d1b0: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
d1c0: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
d1d0: 55 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69 73  USLEEP.  /* This
d1e0: 20 63 61 73 65 20 69 73 20 66 6f 72 20 73 79 73   case is for sys
d1f0: 74 65 6d 73 20 74 68 61 74 20 68 61 76 65 20 73  tems that have s
d200: 75 70 70 6f 72 74 20 66 6f 72 20 73 6c 65 65 70  upport for sleep
d210: 69 6e 67 20 66 6f 72 20 66 72 61 63 74 69 6f 6e  ing for fraction
d220: 73 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f  s of.  ** a seco
d230: 6e 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20  nd.  Examples:  
d240: 41 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79 73 74  All windows syst
d250: 65 6d 73 2c 20 75 6e 69 78 20 73 79 73 74 65 6d  ems, unix system
d260: 73 20 77 69 74 68 20 75 73 6c 65 65 70 28 29 20  s with usleep() 
d270: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
d280: 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a  t u8 delays[] =.
d290: 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20       { 1, 2, 5, 
d2a0: 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20  10, 15, 20, 25, 
d2b0: 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35  25,  25,  50,  5
d2c0: 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74  0, 100 };.  stat
d2d0: 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61  ic const u8 tota
d2e0: 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c  ls[] =.     { 0,
d2f0: 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33   1, 3,  8, 18, 3
d300: 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20  3, 53, 78, 103, 
d310: 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b  128, 178, 228 };
d320: 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59  .# define NDELAY
d330: 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79   ArraySize(delay
d340: 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s).  sqlite3 *db
d350: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
d360: 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d  r;.  int tmout =
d370: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d380: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
d390: 72 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53 51  rior;..#ifdef SQ
d3a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
d3b0: 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66 28 20  K_TIMEOUT.  if( 
d3c0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
d3d0: 74 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54  trol(pFile,SQLIT
d3e0: 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d  E_FCNTL_LOCK_TIM
d3f0: 45 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51  EOUT,&tmout)==SQ
d400: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
d410: 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20  f( count ){.    
d420: 20 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20    tmout = 0;.   
d430: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
d440: 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53  Control(pFile, S
d450: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
d460: 5f 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74  _TIMEOUT, &tmout
d470: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d480: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
d490: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d4a0: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
d4b0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d4c0: 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
d4d0: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
d4e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
d4f0: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
d500: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
d510: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
d520: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
d530: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
d540: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
d550: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
d560: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
d570: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
d580: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
d590: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
d5a0: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d  ior + delay > tm
d5b0: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
d5c0: 20 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72   = tmout - prior
d5d0: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
d5e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d5f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
d600: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
d610: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
d620: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f  urn 1;.#else.  /
d630: 2a 20 54 68 69 73 20 63 61 73 65 20 66 6f 72 20  * This case for 
d640: 75 6e 69 78 20 73 79 73 74 65 6d 73 20 74 68 61  unix systems tha
d650: 74 20 6c 61 63 6b 20 75 73 6c 65 65 70 28 29 20  t lack usleep() 
d660: 73 75 70 70 6f 72 74 2e 20 20 53 6c 65 65 70 69  support.  Sleepi
d670: 6e 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  ng.  ** must be 
d680: 64 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e  done in incremen
d690: 74 73 20 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f  ts of whole seco
d6a0: 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nds */.  sqlite3
d6b0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
d6c0: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f  *)ptr;.  int tmo
d6d0: 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a  ut = ((sqlite3 *
d6e0: 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f  )ptr)->busyTimeo
d6f0: 75 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ut;.  UNUSED_PAR
d700: 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a 20  AMETER(pFile);. 
d710: 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31   if( (count+1)*1
d720: 30 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20  000 > tmout ){. 
d730: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d740: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
d750: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
d760: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
d770: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
d780: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
d790: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
d7a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d7b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
d7c0: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
d7d0: 66 61 69 6c 65 64 20 74 6f 20 61 63 71 75 69 72  failed to acquir
d7e0: 65 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56  e a.** lock on V
d7f0: 46 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a  FS file pFile..*
d800: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
d810: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
d820: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
d830: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
d840: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
d850: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
d860: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
d870: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
d880: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
d890: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
d8a0: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c  (BusyHandler *p,
d8b0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
d8c0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  File){.  int rc;
d8d0: 0a 20 20 69 66 28 20 70 2d 3e 78 42 75 73 79 48  .  if( p->xBusyH
d8e0: 61 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e  andler==0 || p->
d8f0: 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e  nBusy<0 ) return
d900: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45 78   0;.  if( p->bEx
d910: 74 72 61 46 69 6c 65 41 72 67 20 29 7b 0a 20 20  traFileArg ){.  
d920: 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 78 74 72    /* Add an extr
d930: 61 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68  a parameter with
d940: 20 74 68 65 20 70 46 69 6c 65 20 70 6f 69 6e 74   the pFile point
d950: 65 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  er to the end of
d960: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   the.    ** call
d970: 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69  back argument li
d980: 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a  st */.    int (*
d990: 78 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xTra)(void*,int,
d9a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
d9b0: 20 20 20 20 78 54 72 61 20 3d 20 28 69 6e 74 28      xTra = (int(
d9c0: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c  *)(void*,int,sql
d9d0: 69 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78  ite3_file*))p->x
d9e0: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
d9f0: 20 72 63 20 3d 20 78 54 72 61 28 70 2d 3e 70 42   rc = xTra(p->pB
da00: 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  usyArg, p->nBusy
da10: 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73  , pFile);.  }els
da20: 65 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63 79  e{.    /* Legacy
da30: 20 73 74 79 6c 65 20 62 75 73 79 20 68 61 6e 64   style busy hand
da40: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ler callback */.
da50: 20 20 20 20 72 63 20 3d 20 70 2d 3e 78 42 75 73      rc = p->xBus
da60: 79 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73  yHandler(p->pBus
da70: 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b  yArg, p->nBusy);
da80: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
da90: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
daa0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
dab0: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
dac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dad0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
dae0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
daf0: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
db00: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
db10: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
db20: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
db30: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
db40: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
db50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
db60: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
db70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
db80: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
db90: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
dba0: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
dbb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
dbc0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
dbd0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
dbe0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
dbf0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
dc00: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
dc10: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
dc20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
dc30: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78  b->busyHandler.x
dc40: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
dc50: 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  usy;.  db->busyH
dc60: 61 6e 64 6c 65 72 2e 70 42 75 73 79 41 72 67 20  andler.pBusyArg 
dc70: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
dc80: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
dc90: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
dca0: 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c  andler.bExtraFil
dcb0: 65 41 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eArg = 0;.  db->
dcc0: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b  busyTimeout = 0;
dcd0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
dce0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
dcf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dd00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
dd10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
dd20: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
dd30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
dd40: 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67  ne sets the prog
dd50: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ress callback fo
dd60: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
dd70: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
dd80: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
dd90: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
dda0: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  given argument. 
ddb0: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
ddc0: 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65  lback will.** be
ddd0: 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e   invoked every n
dde0: 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  Ops opcodes..*/.
ddf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f  void sqlite3_pro
de00: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20  gress_handler(. 
de10: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
de20: 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74   int nOps,.  int
de30: 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f   (*xProgress)(vo
de40: 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70  id*), .  void *p
de50: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
de60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
de70: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
de80: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
de90: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
dea0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
deb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
dec0: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
ded0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
dee0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
def0: 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a    if( nOps>0 ){.
df00: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
df10: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
df20: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
df30: 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Ops = (unsigned)
df40: 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50  nOps;.    db->pP
df50: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
df60: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
df70: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
df80: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  0;.    db->nProg
df90: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
dfa0: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
dfb0: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  g = 0;.  }.  sql
dfc0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
dfd0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  (db->mutex);.}.#
dfe0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
dff0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
e000: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
e010: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
e020: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
e030: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
e040: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
e050: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
e060: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
e070: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
e080: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
e090: 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53  nt ms){.#ifdef S
e0a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e0b0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e0c0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e0d0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
e0e0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e0f0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
e100: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c   ms>0 ){.    sql
e110: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
e120: 72 28 64 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f  r(db, (int(*)(vo
e130: 69 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65 44  id*,int))sqliteD
e140: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
e150: 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20   (void*)db);.   
e180: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
e190: 20 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62   = ms;.    db->b
e1a0: 75 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72  usyHandler.bExtr
e1b0: 61 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20  aFileArg = 1;.  
e1c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e1d0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
e1e0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
e1f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e200: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
e210: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
e220: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
e230: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
e240: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
e250: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
e260: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
e270: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
e280: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e290: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
e2a0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
e2b0: 64 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c  db) && (db==0 ||
e2c0: 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49   db->magic!=SQLI
e2d0: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29  TE_MAGIC_ZOMBIE)
e2e0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e2f0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e300: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
e310: 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75  }.#endif.  db->u
e320: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
e330: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
e340: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e350: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
e360: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
e370: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
e380: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
e390: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
e3a0: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
e3b0: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
e3c0: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
e3d0: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
e3e0: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
e3f0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e400: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
e410: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
e420: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
e430: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
e440: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
e450: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
e460: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
e470: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e480: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
e490: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e4a0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
e4b0: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
e4c0: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e4d0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e4e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e4f0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e500: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e510: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e520: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e530: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e540: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
e550: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
e560: 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20  pDestructor.){. 
e570: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
e580: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  nt nName;.  int 
e590: 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61  extraFlags;..  a
e5a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e5b0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
e5c0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
e5d0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
e5e0: 7c 0a 20 20 20 20 20 20 28 78 53 46 75 6e 63 20  |.      (xSFunc 
e5f0: 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53  && (xFinal || xS
e600: 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20  tep)) || .      
e610: 28 21 78 53 46 75 6e 63 20 26 26 20 28 78 46 69  (!xSFunc && (xFi
e620: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
e630: 7c 7c 0a 20 20 20 20 20 20 28 21 78 53 46 75 6e  ||.      (!xSFun
e640: 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26  c && (!xFinal &&
e650: 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20   xStep)) ||.    
e660: 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41    (nArg<-1 || nA
e670: 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  rg>SQLITE_MAX_FU
e680: 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20  NCTION_ARG) ||. 
e690: 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65       (255<(nName
e6a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e6b0: 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  30( zFunctionNam
e6c0: 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  e))) ){.    retu
e6d0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e6e0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73  _BKPT;.  }..  as
e6f0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
e700: 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49  C_CONSTANT==SQLI
e710: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
e720: 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73   );.  extraFlags
e730: 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45   = enc &  SQLITE
e740: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a  _DETERMINISTIC;.
e750: 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45    enc &= (SQLITE
e760: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51  _FUNC_ENCMASK|SQ
e770: 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69  LITE_ANY);.  .#i
e780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e790: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20  T_UTF16.  /* If 
e7a0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
e7b0: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
e7c0: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
e7d0: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
e7e0: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
e7f0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
e800: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
e810: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
e820: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
e830: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
e840: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
e850: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
e860: 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45  *.  ** If SQLITE
e870: 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65  _ANY is specifie
e880: 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72  d, add three ver
e890: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e  sions of the fun
e8a0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  ction.  ** to th
e8b0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20  e hash table..  
e8c0: 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51  */.  if( enc==SQ
e8d0: 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20  LITE_UTF16 ){.  
e8e0: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
e8f0: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65  TF16NATIVE;.  }e
e900: 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  lse if( enc==SQL
e910: 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69  ITE_ANY ){.    i
e920: 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  nt rc;.    rc = 
e930: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
e940: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
e950: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
e960: 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67  E_UTF8|extraFlag
e970: 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65  s,.         pUse
e980: 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78  rData, xSFunc, x
e990: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44  Step, xFinal, pD
e9a0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
e9b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e9c0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
e9d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
e9e0: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
e9f0: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
ea00: 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46  E_UTF16LE|extraF
ea10: 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
ea20: 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e  pUserData, xSFun
ea30: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
ea40: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
ea50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
ea60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ea70: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ea80: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
ea90: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
eaa0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
eab0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
eac0: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
ead0: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
eae0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
eaf0: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
eb00: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
eb10: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
eb20: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
eb30: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
eb40: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
eb50: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
eb60: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
eb70: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
eb80: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
eb90: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
eba0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
ebb0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
ebc0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
ebd0: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
ebe0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
ebf0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
ec00: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
ec10: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  ionName, nArg, (
ec20: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
ec30: 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46  ( p && (p->funcF
ec40: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
ec50: 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63  NC_ENCMASK)==enc
ec60: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
ec70: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
ec80: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
ec90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
eca0: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
ecb0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
ecc0: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
ecd0: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
ece0: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
ecf0: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
ed00: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
ed10: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
ed20: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
ed30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ed40: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
ed50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
ed60: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
ed70: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ents(db);.    }.
ed80: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
ed90: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
eda0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
edb0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
edc0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
edd0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
ede0: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
edf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
ee00: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
ee10: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
ee20: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66  older version of
ee30: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
ee40: 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20  th a configured 
ee50: 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20  destructor is.  
ee60: 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ** being replace
ee70: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  d invoke the des
ee80: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
ee90: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63   here. */.  func
eea0: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
eeb0: 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74  p);..  if( pDest
eec0: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
eed0: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b  estructor->nRef+
eee0: 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70 44  +;.  }.  p->u.pD
eef0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73  estructor = pDes
ef00: 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75  tructor;.  p->fu
ef10: 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75  ncFlags = (p->fu
ef20: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
ef30: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c  _FUNC_ENCMASK) |
ef40: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74   extraFlags;.  t
ef50: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63  estcase( p->func
ef60: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  Flags & SQLITE_D
ef70: 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a  ETERMINISTIC );.
ef80: 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78 53    p->xSFunc = xS
ef90: 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a 20  Func ? xSFunc : 
efa0: 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e  xStep;.  p->xFin
efb0: 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a  alize = xFinal;.
efc0: 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d    p->pUserData =
efd0: 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d   pUserData;.  p-
efe0: 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72  >nArg = (u16)nAr
eff0: 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
f000: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f010: 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20  Create new user 
f020: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  functions..*/.in
f030: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
f040: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
f050: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
f060: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
f070: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
f080: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
f090: 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63  .  void (*xSFunc
f0a0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
f0b0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
f0c0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
f0d0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
f0e0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
f0f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
f100: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
f110: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
f120: 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  xt*).){.  return
f130: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
f140: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
f150: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
f160: 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  , p, xSFunc, xSt
f170: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
f1a0: 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  0);.}..int sqlit
f1b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f1c0: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
f1d0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
f1e0: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
f1f0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
f200: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
f210: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
f220: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f230: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f240: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
f250: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
f260: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
f270: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
f280: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
f290: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
f2a0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
f2b0: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
f2c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f2d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
f2e0: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
f2f0: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
f300: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f310: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f320: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f330: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
f340: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
f350: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
f360: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f370: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f380: 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72  x);.  if( xDestr
f390: 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d  oy ){.    pArg =
f3a0: 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72   (FuncDestructor
f3b0: 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
f3c0: 28 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74  (sizeof(FuncDest
f3d0: 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66  ructor));.    if
f3e0: 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20  ( !pArg ){.     
f3f0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
f400: 28 64 62 29 3b 0a 20 20 20 20 20 20 78 44 65 73  (db);.      xDes
f410: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67  troy(p);.      g
f420: 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  oto out;.    }. 
f430: 20 20 20 70 41 72 67 2d 3e 6e 52 65 66 20 3d 20     pArg->nRef = 
f440: 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65  0;.    pArg->xDe
f450: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
f460: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
f470: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
f480: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
f490: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
f4a0: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
f4b0: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20   xSFunc, xStep, 
f4c0: 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20  xFinal, pArg);. 
f4d0: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
f4e0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
f4f0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f500: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78  LITE_OK );.    x
f510: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
f520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72  sqlite3_free(pAr
f530: 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20  g);.  }.. out:. 
f540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
f550: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
f560: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f570: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f580: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f590: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f5a0: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
f5b0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
f5c0: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
f5d0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
f5e0: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
f5f0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
f600: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
f610: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
f620: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
f630: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
f640: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
f650: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
f660: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
f670: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
f680: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
f690: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
f6a0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
f6b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
f6c0: 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64  r *zFunc8;..#ifd
f6d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f6e0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
f6f0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f700: 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46  heckOk(db) || zF
f710: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29  unctionName==0 )
f720: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
f730: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
f740: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f750: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f760: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
f770: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f780: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
f790: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
f7a0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
f7b0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
f7c0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
f7d0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
f7e0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
f7f0: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
f800: 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c  p, xSFunc,xStep,
f810: 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c  xFinal,0);.  sql
f820: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f830: 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73  Func8);.  rc = s
f840: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
f850: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
f860: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f870: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f880: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
f890: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
f8a0: 77 69 6e 67 20 69 73 20 74 68 65 20 69 6d 70 6c  wing is the impl
f8b0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e  ementation of an
f8c0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68   SQL function th
f8d0: 61 74 20 61 6c 77 61 79 73 0a 2a 2a 20 66 61 69  at always.** fai
f8e0: 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ls with an error
f8f0: 20 6d 65 73 73 61 67 65 20 73 74 61 74 69 6e 67   message stating
f900: 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
f910: 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 74 68  on is used in th
f920: 65 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f 6e 74 65  e.** wrong conte
f930: 78 74 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  xt.  The sqlite3
f940: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
f950: 6f 6e 28 29 20 41 50 49 20 6d 69 67 68 74 20 63  on() API might c
f960: 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 53 51 4c 20  onstruct.** SQL 
f970: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73  function that us
f980: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
f990: 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
f9a0: 69 6f 6e 73 20 77 69 6c 6c 20 65 78 69 73 74 0a  ions will exist.
f9b0: 2a 2a 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f  ** for name reso
f9c0: 6c 75 74 69 6f 6e 20 62 75 74 20 61 72 65 20 61  lution but are a
f9d0: 63 74 75 61 6c 6c 79 20 6f 76 65 72 6c 6f 61 64  ctually overload
f9e0: 65 64 20 62 79 20 74 68 65 20 78 46 69 6e 64 46  ed by the xFindF
f9f0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65 74 68 6f  unction.** metho
fa00: 64 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62  d of virtual tab
fa10: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
fa20: 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 76 61 6c  oid sqlite3Inval
fa30: 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  idFunction(.  sq
fa40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
fa50: 6f 6e 74 65 78 74 2c 20 20 2f 2a 20 54 68 65 20  ontext,  /* The 
fa60: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 69 6e 67  function calling
fa70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
fa80: 74 20 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20  t NotUsed,      
fa90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
faa0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
fab0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
fac0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
fad0: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 20 20 20  ue **NotUsed2   
fae0: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65 61 63 68  /* Value of each
faf0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
fb00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
fb10: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
fb20: 72 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  r*)sqlite3_user_
fb30: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20  data(context);. 
fb40: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55   char *zErr;.  U
fb50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
fb60: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
fb70: 64 32 29 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71  d2);.  zErr = sq
fb80: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
fb90: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
fba0: 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 25 73 20  use function %s 
fbb0: 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
fbc0: 20 63 6f 6e 74 65 78 74 22 2c 20 7a 4e 61 6d 65   context", zName
fbd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
fbe0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
fbf0: 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20  t, zErr, -1);.  
fc00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
fc10: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  r);.}../*.** Dec
fc20: 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  lare that a func
fc30: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  tion has been ov
fc40: 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69  erloaded by a vi
fc50: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
fc60: 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
fc70: 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  on already exist
fc80: 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67  s as a regular g
fc90: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20  lobal function, 
fca0: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
fcb0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
fcc0: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
fcd0: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
fce0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a  , then create.**
fcf0: 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20   a new one that 
fd00: 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20  always throws a 
fd10: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20  run-time error. 
fd20: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72   .**.** When vir
fd30: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65  tual tables inte
fd40: 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  nd to provide an
fd50: 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
fd60: 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68  tion, they.** sh
fd70: 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72  ould call this r
fd80: 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73  outine to make s
fd90: 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66  ure the global f
fda0: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a  unction exists..
fdb0: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ** A global func
fdc0: 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20  tion must exist 
fdd0: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d  in order for nam
fde0: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  e resolution to 
fdf0: 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79  work.** properly
fe00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fe10: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
fe20: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
fe30: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
fe40: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  *zName,.  int nA
fe50: 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  rg.){.  int rc;.
fe60: 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a 0a    char *zCopy;..
fe70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
fe80: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
fe90: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
fea0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
feb0: 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41  | zName==0 || nA
fec0: 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74  rg<-2 ){.    ret
fed0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
fee0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
fef0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
ff00: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ff10: 65 78 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ex);.  rc = sqli
ff20: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
ff30: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
ff40: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
ff50: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  !=0;.  sqlite3_m
ff60: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ff70: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 72 63 20  utex);.  if( rc 
ff80: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ff90: 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d 20 73 71  OK;.  zCopy = sq
ffa0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 4e  lite3_mprintf(zN
ffb0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 70  ame);.  if( zCop
ffc0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
ffd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 65  LITE_NOMEM;.  re
ffe0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
fff0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
10000 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
10010 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 2c 20           zCopy, 
10040 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
10050 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 73 71  nction, 0, 0, sq
10060 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 0a  lite3_free);.}..
10070 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10080 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
10090 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
100a0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
100b0 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
100c0 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
100d0 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
100e0 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
100f0 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
10100 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
10110 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
10120 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
10130 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
10140 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
10150 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
10160 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
10170 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
10180 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
10190 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
101a0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
101b0 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  TED.void *sqlite
101c0 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20  3_trace(sqlite3 
101d0 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54 72 61 63  *db, void(*xTrac
101e0 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
101f0 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
10200 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
10210 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10220 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10230 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10240 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
10250 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
10260 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10270 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
10280 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
10290 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
102a0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
102b0 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63  pOld = db->pTrac
102c0 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72 61  eArg;.  db->mTra
102d0 63 65 20 3d 20 78 54 72 61 63 65 20 3f 20 53 51  ce = xTrace ? SQ
102e0 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45 47 41 43  LITE_TRACE_LEGAC
102f0 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54 72  Y : 0;.  db->xTr
10300 61 63 65 20 3d 20 28 69 6e 74 28 2a 29 28 75 33  ace = (int(*)(u3
10310 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f  2,void*,void*,vo
10320 69 64 2a 29 29 78 54 72 61 63 65 3b 0a 20 20 64  id*))xTrace;.  d
10330 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
10340 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
10350 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
10360 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10370 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
10380 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
10390 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a 20  PRECATED */../* 
103a0 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
103b0 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20   callback using 
103c0 74 68 65 20 76 65 72 73 69 6f 6e 2d 32 20 69 6e  the version-2 in
103d0 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
103e0 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32  sqlite3_trace_v2
103f0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10420 2a 20 54 72 61 63 65 20 74 68 69 73 20 63 6f 6e  * Trace this con
10430 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73  nection */.  uns
10440 69 67 6e 65 64 20 6d 54 72 61 63 65 2c 20 20 20  igned mTrace,   
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
10470 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 62 65 20  of events to be 
10480 74 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74 28  traced */.  int(
10490 2a 78 54 72 61 63 65 29 28 75 6e 73 69 67 6e 65  *xTrace)(unsigne
104a0 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f  d,void*,void*,vo
104b0 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62 61  id*),  /* Callba
104c0 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f 0a  ck to invoke */.
104d0 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10500 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23 69  Context */.){.#i
10510 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10520 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
10530 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10540 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
10550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10560 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
10570 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
10580 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10590 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
105a0 28 20 6d 54 72 61 63 65 3d 3d 30 20 29 20 78 54  ( mTrace==0 ) xT
105b0 72 61 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  race = 0;.  if( 
105c0 78 54 72 61 63 65 3d 3d 30 20 29 20 6d 54 72 61  xTrace==0 ) mTra
105d0 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 54  ce = 0;.  db->mT
105e0 72 61 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a 20  race = mTrace;. 
105f0 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54   db->xTrace = xT
10600 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61  race;.  db->pTra
10610 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ceArg = pArg;.  
10620 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10630 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
10640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10650 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
10660 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
10670 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67 69  CATED./*.** Regi
10680 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66  ster a profile f
10690 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
106a0 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
106b0 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
106c0 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75  d .** profile fu
106d0 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  nction is return
106e0 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
106f0 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  LL profile funct
10700 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
10710 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65  o profiling is e
10720 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
10730 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  NULL.** profile 
10740 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
10750 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
10760 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
10770 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a  e conclusion of.
10780 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ** each SQL stat
10790 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75  ement that is ru
107a0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
107b0 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73  te3_profile(.  s
107c0 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
107d0 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76  id (*xProfile)(v
107e0 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
107f0 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c  ,sqlite_uint64),
10800 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
10810 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a  .  void *pOld;..
10820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10830 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
10840 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
10850 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
10860 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
10870 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10880 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10890 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
108a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
108b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
108c0 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
108d0 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
108e0 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
108f0 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
10900 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
10910 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10920 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10930 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
10940 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10950 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f  IT_DEPRECATED */
10960 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10970 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
10980 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
10990 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  a function to be
109a0 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20   invoked when a 
109b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
109c0 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  its..** If the i
109d0 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
109e0 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
109f0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
10a00 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
10a10 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
10a20 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
10a30 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
10a40 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10a50 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
10a60 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
10a70 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
10a80 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
10a90 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
10aa0 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
10ab0 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
10ac0 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
10ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
10ae0 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
10af0 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
10b00 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
10b10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10b20 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10b30 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10b40 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
10b50 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
10b60 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
10b70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
10b80 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
10b90 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10ba0 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
10bb0 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
10bc0 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
10bd0 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
10be0 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
10bf0 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
10c00 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10c10 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10c20 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
10c30 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
10c40 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
10c50 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
10c60 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
10c70 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
10c80 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
10c90 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
10ca0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
10cb0 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
10cc0 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
10cd0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10ce0 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
10cf0 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
10d00 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
10d10 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
10d20 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
10d30 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
10d40 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
10d50 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d70 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
10d80 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
10d90 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
10da0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10db0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10dc0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10dd0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
10de0 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
10df0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
10e00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10e10 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10e20 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10e30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
10e40 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72   = db->pUpdateAr
10e50 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65  g;.  db->xUpdate
10e60 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
10e70 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64  back;.  db->pUpd
10e80 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
10e90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10ea0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10eb0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
10ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
10ed0 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
10ee0 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
10ef0 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
10f00 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20  on is rolled.** 
10f10 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74  back by this dat
10f20 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10f30 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
10f40 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
10f50 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f70 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
10f80 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
10f90 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
10fa0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
10fb0 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
10fc0 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
10fd0 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
10fe0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
10ff0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
11000 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
11010 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Ret;..#ifdef SQL
11020 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
11030 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
11040 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
11050 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
11060 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
11070 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
11080 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
11090 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
110a0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
110b0 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52  .  pRet = db->pR
110c0 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62  ollbackArg;.  db
110d0 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
110e0 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
110f0 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  .  db->pRollback
11100 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
11110 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11120 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
11130 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
11140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11150 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
11160 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  OOK./*.** Regist
11170 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
11180 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
11190 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
111a0 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
111b0 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
111c0 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
111d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
111e0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
111f0 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  preupdate_hook(.
11200 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11220 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
11230 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
11240 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c  */.  void(*xCall
11250 62 61 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f  back)(         /
11260 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
11270 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a  ion */.    void*
11280 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68  ,sqlite3*,int,ch
11290 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63  ar const*,char c
112a0 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e  onst*,sqlite3_in
112b0 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  t64,sqlite3_int6
112c0 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63  /* First callbac
112f0 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  k argument */.){
11300 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
11310 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11320 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11330 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50  .  pRet = db->pP
11340 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  reUpdateArg;.  d
11350 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
11360 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
11370 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  k;.  db->pPreUpd
11380 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
11390 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
113a0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
113b0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
113c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
113d0 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
113e0 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66  ATE_HOOK */..#if
113f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11400 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  _WAL./*.** The s
11410 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
11420 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  ) callback regis
11430 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  tered by sqlite3
11440 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
11450 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  int()..** Invoke
11460 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
11470 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e  ckpoint if the n
11480 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
11490 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a  in the log file.
114a0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
114b0 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41  an sqlite3.pWalA
114c0 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e  rg cast to an in
114d0 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65  teger (the value
114e0 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a   configured by.*
114f0 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  * wal_autocheckp
11500 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74  oint())..*/ .int
11510 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
11520 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a  ltHook(.  void *
11530 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20  pClientData,    
11540 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a   /* Argument */.
11550 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11560 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
11570 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
11580 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
11590 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a     /* Database *
115a0 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20  /.  int nFrame  
115b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
115c0 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a  ze of WAL */.){.
115d0 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51    if( nFrame>=SQ
115e0 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
115f0 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a  pClientData) ){.
11600 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11610 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11620 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
11630 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
11640 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
11650 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
11660 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
11680 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11690 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
116a0 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71   Configure an sq
116b0 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
116c0 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
116d0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
116e0 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62  point.** a datab
116f0 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74  ase after commit
11700 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
11710 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
11720 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72  nFrame or.** mor
11730 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  e frames in the 
11740 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e  log file. Passin
11750 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61  g zero or a nega
11760 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68  tive value as th
11770 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61  e.** nFrame para
11780 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61  meter disables a
11790 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
117a0 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  ints entirely..*
117b0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
117c0 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
117d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
117e0 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74  places any exist
117f0 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ing callback.** 
11800 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  registered using
11810 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
11820 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72  k(). Likewise, r
11830 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c  egistering a cal
11840 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73  lback.** using s
11850 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
11860 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  ) disables the a
11870 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
11880 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  int mechanism.**
11890 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
118a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
118b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
118c0 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
118d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
118e0 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66   nFrame){.#ifdef
118f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11900 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11910 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
11920 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61  D_PARAMETER(nFra
11930 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65  me);.#else.#ifde
11940 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11950 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
11960 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
11970 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
11980 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
11990 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
119a0 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a  if( nFrame>0 ){.
119b0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
119c0 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33  hook(db, sqlite3
119d0 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20  WalDefaultHook, 
119e0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
119f0 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65  R(nFrame));.  }e
11a00 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
11a10 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c  _wal_hook(db, 0,
11a20 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
11a30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
11a50 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
11a60 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
11a70 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
11a80 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65  action is writte
11a90 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72  n.** into the wr
11aa0 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79  ite-ahead-log by
11ab0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
11ac0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
11ad0 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f  id *sqlite3_wal_
11ae0 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
11af0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
11b00 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
11b10 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
11b20 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  is db handle */.
11b30 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
11b40 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65  )(void *, sqlite
11b50 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
11b60 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70   int),.  void *p
11b70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
11b80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
11b90 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
11ba0 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  d to xCallback()
11bb0 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
11bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
11bd0 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66   void *pRet;.#if
11be0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11bf0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
11c00 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
11c10 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
11c20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
11c30 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
11c40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
11c50 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
11c60 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
11c70 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
11c80 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20   db->pWalArg;.  
11c90 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
11ca0 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
11cb0 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41  db->pWalArg = pA
11cc0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11cd0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11ce0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11cf0 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  Ret;.#else.  ret
11d00 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
11d10 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
11d20 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a  t database zDb..
11d30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
11d40 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
11d50 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11d80 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
11d90 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
11da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11db0 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20  ame of attached 
11dc0 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c  database (or NUL
11dd0 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64  L) */.  int eMod
11de0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11df0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
11e00 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76  E_CHECKPOINT_* v
11e10 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
11e20 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20  nLog,           
11e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
11e40 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f  : Size of WAL lo
11e50 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20  g in frames */. 
11e60 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20   int *pnCkpt    
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e   /* OUT: Total n
11e90 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
11ea0 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a  checkpointed */.
11eb0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
11ec0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75  _OMIT_WAL.  retu
11ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
11ee0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  lse.  int rc;   
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11f10 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  code */.  int iD
11f20 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  b = SQLITE_MAX_A
11f30 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c  TTACHED;  /* sql
11f40 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78  ite3.aDb[] index
11f50 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70   of db to checkp
11f60 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  oint */..#ifdef 
11f70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
11f80 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
11f90 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
11fa0 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
11fb0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
11fc0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  KPT;.#endif..  /
11fd0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
11fe0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
11ff0 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20  s to -1 in case 
12000 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
12010 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20   */.  if( pnLog 
12020 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20  ) *pnLog = -1;. 
12030 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70   if( pnCkpt ) *p
12040 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61  nCkpt = -1;..  a
12050 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
12060 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
12070 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
12080 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
12090 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
120a0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
120b0 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
120c0 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  T==2 );.  assert
120d0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
120e0 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20  INT_TRUNCATE==3 
120f0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
12100 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
12110 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
12120 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
12130 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  INT_TRUNCATE ){.
12140 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
12150 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38  OF: R-03996-1208
12160 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65  8 The M paramete
12170 72 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69  r must be a vali
12180 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20  d checkpoint.   
12190 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20   ** mode: */.   
121a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
121b0 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  ISUSE;.  }..  sq
121c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
121d0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
121e0 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30  if( zDb && zDb[0
121f0 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73  ] ){.    iDb = s
12200 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
12210 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  (db, zDb);.  }. 
12220 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
12230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
12240 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
12250 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
12260 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22   SQLITE_ERROR, "
12270 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
12280 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  : %s", zDb);.  }
12290 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75  else{.    db->bu
122a0 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
122b0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
122c0 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
122d0 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20  db, iDb, eMode, 
122e0 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
122f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12300 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
12310 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
12320 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20  xit(db, rc);..  
12330 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
12340 6e 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  no active statem
12350 65 6e 74 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ents, clear the 
12360 69 6e 74 65 72 72 75 70 74 20 66 6c 61 67 20 61  interrupt flag a
12370 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
12380 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  t.  */.  if( db-
12390 3e 6e 56 64 62 65 41 63 74 69 76 65 3d 3d 30 20  >nVdbeActive==0 
123a0 29 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e 69 73  ){.    db->u1.is
123b0 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 30 3b  Interrupted = 0;
123c0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
123d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
123e0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
123f0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
12400 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
12410 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49   database zDb. I
12420 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f  f zDb is NULL, o
12430 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  r if the buffer 
12440 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zDb points.** to
12450 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f   contains a zero
12460 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20  -length string, 
12470 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
12480 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63  abases are .** c
12490 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a  heckpointed..*/.
124a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
124b0 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
124c0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
124d0 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45  ar *zDb){.  /* E
124e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31  VIDENCE-OF: R-41
124f0 36 31 33 2d 32 30 35 35 33 20 54 68 65 20 73 71  613-20553 The sq
12500 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
12510 6f 69 6e 74 28 44 2c 58 29 20 69 73 20 65 71 75  oint(D,X) is equ
12520 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  ivalent to.  ** 
12530 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
12540 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51  kpoint_v2(D,X,SQ
12550 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
12560 50 41 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f  PASSIVE,0,0). */
12570 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
12580 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
12590 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54  _v2(db,zDb,SQLIT
125a0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
125b0 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69  SIVE,0,0);.}..#i
125c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
125d0 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  T_WAL./*.** Run 
125e0 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20  a checkpoint on 
125f0 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68  database iDb. Th
12600 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
12610 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73   database iDb is
12620 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  .** not currentl
12630 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  y open in WAL mo
12640 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  de..**.** If a t
12650 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
12660 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
12670 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  se being checkpo
12680 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20  inted, this .** 
12690 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
126a0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61   SQLITE_LOCKED a
126b0 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  nd a checkpoint 
126c0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
126d0 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
126e0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
126f0 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b  unning the check
12700 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65  point, an SQLite
12710 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
12720 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65  ** returned (i.e
12730 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e  . SQLITE_IOERR).
12740 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
12750 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
12760 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
12770 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f  se handle db sho
12780 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74  uld be held by t
12790 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d  he caller. The m
127a0 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74  utex.** associat
127b0 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
127c0 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e  ific b-tree bein
127d0 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69  g checkpointed i
127e0 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68  s taken by.** th
127f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  is function whil
12800 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
12810 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a   is running..**.
12820 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73  ** If iDb is pas
12830 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  sed SQLITE_MAX_A
12840 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c  TTACHED, then al
12850 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
12860 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63  ases are.** chec
12870 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20  kpointed. If an 
12880 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
12890 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72  ered it is retur
128a0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ned immediately 
128b0 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20  -.** no attempt 
128c0 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b  is made to check
128d0 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e  point any remain
128e0 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ing databases..*
128f0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
12900 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53  Mode is one of S
12910 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
12920 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 2c 20  _PASSIVE, FULL, 
12930 52 45 53 54 41 52 54 0a 2a 2a 20 6f 72 20 54 52  RESTART.** or TR
12940 55 4e 43 41 54 45 2e 0a 2a 2f 0a 69 6e 74 20 73  UNCATE..*/.int s
12950 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
12960 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
12970 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65  t iDb, int eMode
12980 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e  , int *pnLog, in
12990 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e  t *pnCkpt){.  in
129a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
129b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
129c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
129d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129f0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
12a00 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74  rate through att
12a10 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69  ached dbs */.  i
12a20 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20  nt bBusy = 0;   
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12a40 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45  * True if SQLITE
12a50 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65  _BUSY has been e
12a60 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20  ncountered */.. 
12a70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12a80 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
12a90 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
12aa0 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70  rt( !pnLog || *p
12ab0 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73  nLog==-1 );.  as
12ac0 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c  sert( !pnCkpt ||
12ad0 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a   *pnCkpt==-1 );.
12ae0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
12af0 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c  ->nDb && rc==SQL
12b00 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
12b10 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20    if( i==iDb || 
12b20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  iDb==SQLITE_MAX_
12b30 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20  ATTACHED ){.    
12b40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12b50 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  reeCheckpoint(db
12b60 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d  ->aDb[i].pBt, eM
12b70 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
12b80 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67  pt);.      pnLog
12b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b   = 0;.      pnCk
12ba0 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  pt = 0;.      if
12bb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
12bc0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75  Y ){.        bBu
12bd0 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sy = 1;.        
12be0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12c00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
12c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42  =SQLITE_OK && bB
12c20 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55  usy) ? SQLITE_BU
12c30 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  SY : rc;.}.#endi
12c40 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12c50 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  _WAL */../*.** T
12c60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
12c70 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69  urns true if mai
12c80 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20  n-memory should 
12c90 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
12ca0 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  of.** a temporar
12cb0 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73  y file for trans
12cc0 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73  ient pager files
12cd0 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a   and statement j
12ce0 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20  ournals..** The 
12cf0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64  value returned d
12d00 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
12d10 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f  lue of db->temp_
12d20 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a  store (runtime.*
12d30 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64  * parameter) and
12d40 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d   the compile tim
12d50 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
12d60 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68  E_TEMP_STORE. Th
12d70 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  e.** following t
12d80 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
12d90 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
12da0 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77  between these tw
12db0 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20  o values.** and 
12dc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72  this functions r
12dd0 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  eturn value..**.
12de0 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50  **   SQLITE_TEMP
12df0 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74  _STORE     db->t
12e00 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f  emp_store     Lo
12e10 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72  cation of tempor
12e20 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
12e30 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
12e40 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
12e50 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
12ea0 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
12eb0 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
12ec0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
12ed0 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
12ee0 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
12ef0 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
12f00 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
12f10 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
12f30 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
12f40 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  1).**   1       
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
12f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f70 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
12f80 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
12fb0 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
12fc0 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
12ff0 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
13000 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
13010 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
13020 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
13030 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
13040 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
13050 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20  *   3           
13060 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
13080 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
13090 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
130a0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e  TempInMemory(con
130b0 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  st sqlite3 *db){
130c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
130d0 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75  _STORE==1.  retu
130e0 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
130f0 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ore==2 );.#endif
13100 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
13110 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75  _STORE==2.  retu
13120 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
13130 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66  ore!=1 );.#endif
13140 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
13150 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53  _STORE==3.  UNUS
13160 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
13170 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
13180 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13190 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20  TEMP_STORE<1 || 
131a0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
131b0 45 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E>3.  UNUSED_PAR
131c0 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
131d0 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
131e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  ../*.** Return U
131f0 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67  TF-8 encoded Eng
13200 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
13210 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
13220 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
13230 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
13240 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
13250 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62  rmsg(sqlite3 *db
13260 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
13270 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
13280 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
13290 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
132a0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
132b0 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
132c0 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
132d0 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
132e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
132f0 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
13300 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73  E_BKPT);.  }.  s
13310 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13320 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
13330 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13340 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
13350 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
13360 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13370 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13380 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45  testcase( db->pE
13390 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d  rr==0 );.    z =
133a0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
133b0 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
133c0 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
133d0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
133e0 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
133f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
13400 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
13410 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
13420 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13430 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
13440 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
13450 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
13460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
13470 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
13480 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
13490 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
134a0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
134b0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
134c0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
134d0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
134e0 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
134f0 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
13500 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
13510 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
13520 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
13530 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
13540 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
13550 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
13560 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
13570 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
13580 3d 20 7b 0a 20 20 20 20 27 62 27 2c 20 27 61 27  = {.    'b', 'a'
13590 2c 20 27 64 27 2c 20 27 20 27 2c 20 27 70 27 2c  , 'd', ' ', 'p',
135a0 20 27 61 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'a', 'r', 'a', 
135b0 27 6d 27 2c 20 27 65 27 2c 20 27 74 27 2c 20 27  'm', 'e', 't', '
135c0 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 0a 20 20  e', 'r', ' ',.  
135d0 20 20 27 6f 27 2c 20 27 72 27 2c 20 27 20 27 2c    'o', 'r', ' ',
135e0 20 27 6f 27 2c 20 27 74 27 2c 20 27 68 27 2c 20   'o', 't', 'h', 
135f0 27 65 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27  'e', 'r', ' ', '
13600 41 27 2c 20 27 50 27 2c 20 27 49 27 2c 20 27 20  A', 'P', 'I', ' 
13610 27 2c 0a 20 20 20 20 27 6d 27 2c 20 27 69 27 2c  ',.    'm', 'i',
13620 20 27 73 27 2c 20 27 75 27 2c 20 27 73 27 2c 20   's', 'u', 's', 
13630 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63  'e', 0.  };..  c
13640 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20  onst void *z;.  
13650 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
13660 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75  eturn (void *)ou
13670 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  tOfMem;.  }.  if
13680 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
13690 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
136a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
136b0 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a  (void *)misuse;.
136c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
136d0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
136e0 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
136f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13700 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29      z = (void *)
13710 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73  outOfMem;.  }els
13720 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
13730 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
13740 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69  db->pErr);.    i
13750 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
13760 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
13770 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72  hMsg(db, db->err
13780 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72  Code, sqlite3Err
13790 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
137a0 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  );.      z = sql
137b0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
137c0 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
137d0 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c   }.    /* A mall
137e0 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61  oc() may have fa
137f0 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  iled within the 
13800 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
13810 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20  value_text16(). 
13820 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20     ** above. If 
13830 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
13840 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d  , then the db->m
13850 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
13860 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
13870 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
13880 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f  re returning. Do
13890 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20   this directly, 
138a0 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20  instead of via. 
138b0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69     ** sqlite3Api
138c0 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64  Exit(), to avoid
138d0 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74   setting the dat
138e0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72  abase handle err
138f0 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20  or message..    
13900 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  */.    sqlite3Oo
13910 6d 43 6c 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a  mClear(db);.  }.
13920 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13930 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
13940 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
13950 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13960 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
13970 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13980 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
13990 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
139a0 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
139b0 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
139c0 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
139d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
139e0 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
139f0 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
13a00 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
13a10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13a20 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
13a30 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
13a40 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
13a50 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
13a60 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
13a70 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
13a80 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
13a90 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
13aa0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
13ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13ac0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
13ad0 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
13ae0 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
13af0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  }.int sqlite3_ex
13b00 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73  tended_errcode(s
13b10 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
13b20 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
13b30 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
13b40 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
13b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
13b60 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
13b70 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
13b80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13b90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13ba0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13bb0 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
13bc0 72 72 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71  rrCode;.}.int sq
13bd0 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72  lite3_system_err
13be0 6e 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  no(sqlite3 *db){
13bf0 0a 20 20 72 65 74 75 72 6e 20 64 62 20 3f 20 64  .  return db ? d
13c00 62 2d 3e 69 53 79 73 45 72 72 6e 6f 20 3a 20 30  b->iSysErrno : 0
13c10 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ;.}  ../*.** Ret
13c20 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
13c30 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
13c40 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
13c50 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
13c60 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72  * argument.  For
13c70 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c   now, this simpl
13c80 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65  y calls the inte
13c90 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53  rnal sqlite3ErrS
13ca0 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  tr().** function
13cb0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
13cc0 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28  *sqlite3_errstr(
13cd0 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72  int rc){.  retur
13ce0 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
13cf0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  rc);.}../*.** Cr
13d00 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61  eate a new colla
13d10 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
13d20 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e  r database "db".
13d30 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e    The name is zN
13d40 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65  ame.** and the e
13d50 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a  ncoding is enc..
13d60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
13d70 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eateCollation(. 
13d80 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20   sqlite3* db,.  
13d90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
13da0 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  e, .  u8 enc,.  
13db0 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
13dc0 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
13dd0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
13de0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
13df0 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
13e00 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43  l)(void*).){.  C
13e10 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
13e20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20   int enc2;.  .  
13e30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13e40 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
13e50 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
13e60 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
13e70 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
13e80 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
13e90 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
13ea0 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
13eb0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
13ec0 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
13ed0 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
13ee0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
13ef0 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
13f00 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
13f10 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
13f20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63   */.  enc2 = enc
13f30 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
13f40 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
13f50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
13f60 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
13f70 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20  16_ALIGNED );.  
13f80 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  if( enc2==SQLITE
13f90 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d  _UTF16 || enc2==
13fa0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
13fb0 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32  GNED ){.    enc2
13fc0 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
13fd0 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28  ATIVE;.  }.  if(
13fe0 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46   enc2<SQLITE_UTF
13ff0 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45  8 || enc2>SQLITE
14000 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20  _UTF16BE ){.    
14010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
14020 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
14030 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
14040 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76  is call is remov
14050 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67  ing or replacing
14060 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c   an existing col
14070 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71  lation .  ** seq
14080 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e  uence. If so, an
14090 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
140a0 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62  ve VMs, return b
140b0 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20  usy. If there.  
140c0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
140d0 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65   VMs, invalidate
140e0 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65   any pre-compile
140f0 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
14100 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  */.  pColl = sql
14110 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
14120 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
14130 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ame, 0);.  if( p
14140 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
14150 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Cmp ){.    if( d
14160 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
14170 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14180 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
14190 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
141a0 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
141b0 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63   delete/modify c
141c0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
141d0 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  e due to active 
141e0 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
141f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14200 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
14210 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
14220 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
14230 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  s(db);..    /* I
14240 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
14250 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
14260 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
14270 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
14280 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
14290 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
142a0 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
142b0 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
142c0 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
142d0 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
142e0 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
142f0 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
14300 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
14310 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
14320 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
14330 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
14340 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
14350 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
14360 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
14370 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
14380 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
14390 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
143a0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
143b0 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
143c0 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
143d0 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b  CollSeq, zName);
143e0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
143f0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
14400 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
14410 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
14420 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
14430 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
14440 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
14450 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
14460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14470 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
14480 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14490 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
144a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
144b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
144c0 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
144d0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
144e0 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
144f0 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
14500 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
14510 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14520 54 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  T;.  pColl->xCmp
14530 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70   = xCompare;.  p
14540 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43  Coll->pUser = pC
14550 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65  tx;.  pColl->xDe
14560 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c  l = xDel;.  pCol
14570 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e  l->enc = (u8)(en
14580 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49  c2 | (enc & SQLI
14590 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
145a0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  ));.  sqlite3Err
145b0 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
145c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
145d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
145e0 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
145f0 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
14600 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
14610 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
14620 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
14630 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
14640 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
14650 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
14660 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
14670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
14680 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
14690 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
146a0 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
146b0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
146c0 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
146d0 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
146e0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
146f0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
14700 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
14710 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
14720 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
14730 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
14740 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
14750 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
14760 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
14770 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
14780 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
14790 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a  _NUMBER,      /*
147a0 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32   IMP: R-38091-32
147b0 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f  352 */.  SQLITE_
147c0 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
147d0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
147e0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a  WORKER_THREADS,.
147f0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
14800 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d  ure the hard lim
14810 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72  its are set to r
14820 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73  easonable values
14830 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
14840 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  AX_LENGTH<100.# 
14850 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
14860 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
14870 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
14880 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
14890 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30  AX_SQL_LENGTH<10
148a0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
148b0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
148c0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
148d0 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
148e0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
148f0 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58  ENGTH>SQLITE_MAX
14900 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20  _LENGTH.# error 
14910 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
14920 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62  ENGTH must not b
14930 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  e greater than S
14940 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
14950 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
14960 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
14970 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72  SELECT<2.# error
14980 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
14990 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74  OUND_SELECT must
149a0 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23   be at least 2.#
149b0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
149c0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a  _MAX_VDBE_OP<40.
149d0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
149e0 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20  AX_VDBE_OP must 
149f0 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23  be at least 40.#
14a00 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
14a10 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
14a20 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  G<0 || SQLITE_MA
14a30 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31  X_FUNCTION_ARG>1
14a40 32 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  27.# error SQLIT
14a50 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
14a60 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  RG must be betwe
14a70 65 6e 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e  en 0 and 127.#en
14a80 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
14a90 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c  AX_ATTACHED<0 ||
14aa0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
14ab0 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72  CHED>125.# error
14ac0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
14ad0 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74  CHED must be bet
14ae0 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23  ween 0 and 125.#
14af0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
14b00 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
14b10 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72  N_LENGTH<1.# err
14b20 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  or SQLITE_MAX_LI
14b30 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
14b40 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
14b50 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
14b60 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
14b70 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20  N>32767.# error 
14b80 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
14b90 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65  N must not excee
14ba0 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23  d 32767.#endif.#
14bb0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  if SQLITE_MAX_TR
14bc0 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20  IGGER_DEPTH<1.# 
14bd0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
14be0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d  _TRIGGER_DEPTH m
14bf0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
14c00 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
14c10 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
14c20 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49  HREADS<0 || SQLI
14c30 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
14c40 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72  READS>50.# error
14c50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
14c60 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20  ER_THREADS must 
14c70 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
14c80 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   50.#endif.../*.
14c90 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
14ca0 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20  lue of a limit. 
14cb0 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   Report the old 
14cc0 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20  value..** If an 
14cd0 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e  invalid limit in
14ce0 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c  dex is supplied,
14cf0 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d   report -1..** M
14d00 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62  ake no changes b
14d10 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20  ut still report 
14d20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66  the old value if
14d30 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69   the.** new limi
14d40 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a  t is negative..*
14d50 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72  *.** A new lower
14d60 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20   limit does not 
14d70 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20  shrink existing 
14d80 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49  constructs..** I
14d90 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74  t merely prevent
14da0 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73  s new constructs
14db0 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65   that exceed the
14dc0 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66   limit.** from f
14dd0 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  orming..*/.int s
14de0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c  qlite3_limit(sql
14df0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69  ite3 *db, int li
14e00 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69  mitId, int newLi
14e10 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c  mit){.  int oldL
14e20 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  imit;..#ifdef SQ
14e30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
14e40 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
14e50 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
14e60 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
14e70 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
14e80 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
14e90 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n -1;.  }.#endif
14ea0 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
14eb0 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
14ec0 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
14ed0 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
14ee0 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
14ef0 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
14f00 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
14f10 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
14f20 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
14f30 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
14f40 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
14f50 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
14f60 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
14f70 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
14f80 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
14f90 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
14fa0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
14fb0 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
14fc0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
14fd0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
14fe0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
14ff0 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
15000 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
15010 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
15020 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15030 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
15040 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
15050 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
15060 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15070 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
15080 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
15090 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
150a0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
150b0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
150c0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
150d0 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
150e0 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
150f0 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
15100 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
15110 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
15120 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
15130 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
15140 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15150 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
15160 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
15170 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
15180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15190 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
151a0 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
151b0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
151c0 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
151d0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
151e0 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
151f0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
15200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15230 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
15240 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
15250 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15260 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15270 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
15280 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
15290 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
152a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
152b0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
152c0 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
152d0 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
152e0 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
152f0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15300 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15310 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
15320 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57  S]==SQLITE_MAX_W
15330 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b  ORKER_THREADS );
15340 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
15350 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
15360 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f  HREADS==(SQLITE_
15370 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
15380 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
15390 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
153a0 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
153b0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
153c0 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
153d0 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
153e0 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
153f0 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
15400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
15410 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
15420 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
15430 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
15440 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
15450 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
15460 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
15470 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
15480 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
15490 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
154a0 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
154b0 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
154c0 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154e0 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
154f0 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  35419 */.}../*.*
15500 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15510 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65  is used to parse
15520 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e   both URIs and n
15530 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73  on-URI filenames
15540 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a   passed by the.*
15550 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75  * user to API fu
15560 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
15570 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65  open() or sqlite
15580 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64  3_open_v2(), and
15590 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a   for database.**
155a0 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20   URIs specified 
155b0 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43  as part of ATTAC
155c0 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  H statements..**
155d0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
155e0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
155f0 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
15600 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
15610 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e  o use (or.** a N
15620 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  ULL to signify t
15630 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20  he default VFS) 
15640 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20  if the URI does 
15650 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76  not contain a "v
15660 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79  fs=xxx".** query
15670 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20   parameter. The 
15680 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
15690 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49  contains the URI
156a0 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   (or non-URI fil
156b0 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66  ename).** itself
156c0 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
156d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
156e0 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61  he *pFlags varia
156f0 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ble should conta
15700 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  in.** the defaul
15710 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  t flags to open 
15720 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
15730 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61  dle with. The va
15740 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
15750 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20   *pFlags may be 
15760 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72  updated before r
15770 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20  eturning if the 
15780 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e  URI filename con
15790 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65  tains .** "cache
157a0 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78  =xxx" or "mode=x
157b0 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  xx" query parame
157c0 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ters..**.** If s
157d0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
157e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
157f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a  . In this case *
15800 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20  ppVfs is set to 
15810 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
15820 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20  VFS that should 
15830 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  be used to open 
15840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15850 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65  e. *pzFile is se
15860 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
15870 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
15880 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
15890 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65   the file to ope
158a0 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
158b0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
158c0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
158d0 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
158e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
158f0 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  to release.** th
15900 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  is buffer..**.**
15910 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
15920 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  urs, then an SQL
15930 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
15940 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
15950 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20  pzErrMsg.** may 
15960 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
15970 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
15980 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73  aining an Englis
15990 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
159a0 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74   .** message. It
159b0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
159c0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
159d0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
159e0 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ly release.** th
159f0 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c  is buffer by cal
15a00 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  ling sqlite3_fre
15a10 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
15a20 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63  te3ParseUri(.  c
15a30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
15a40 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f  ultVfs,        /
15a50 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20  * VFS to use if 
15a60 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65  no "vfs=xxx" que
15a70 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63  ry option */.  c
15a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c  onst char *zUri,
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15aa0 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
15ab0 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f   URI to parse */
15ac0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
15ad0 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
15ae0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51     /* IN/OUT: SQ
15af0 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
15b00 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
15b10 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20  _vfs **ppVfs,   
15b20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15b30 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a   VFS to use */ .
15b40 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c    char **pzFile,
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61    /* OUT: Filena
15b70 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  me component of 
15b80 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  URI */.  char **
15b90 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
15ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15bb0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
15bc0 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
15bd0 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
15be0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15bf0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
15c00 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20  gs = *pFlags;.  
15c10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
15c20 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a   = zDefaultVfs;.
15c30 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
15c40 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e   char c;.  int n
15c50 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Uri = sqlite3Str
15c60 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20  len30(zUri);..  
15c70 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73  assert( *pzErrMs
15c80 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  g==0 );..  if( (
15c90 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
15ca0 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20  OPEN_URI)       
15cb0 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
15cc0 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20  48725-32206 */. 
15cd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
15ce0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15cf0 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49  g.bOpenUri) /* I
15d00 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34  MP: R-51689-4654
15d10 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e  8 */.   && nUri>
15d20 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72  =5 && memcmp(zUr
15d30 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d  i, "file:", 5)==
15d40 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38  0 /* IMP: R-5788
15d50 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a  4-37496 */.  ){.
15d60 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a      char *zOpt;.
15d70 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20      int eState; 
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74    /* Parser stat
15da0 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55  e when parsing U
15db0 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  RI */.    int iI
15dc0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
15dd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
15de0 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
15df0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74   */.    int iOut
15e00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15e10 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
15e20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
15e30 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65  */.    u64 nByte
15e40 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20   = nUri+2;      
15e50 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
15e60 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
15e70 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  te */..    /* Ma
15e80 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49  ke sure the SQLI
15e90 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67  TE_OPEN_URI flag
15ea0 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63   is set to indic
15eb0 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78  ate to the VFS x
15ec0 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74  Open .    ** met
15ed0 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d  hod that there m
15ee0 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61  ay be extra para
15ef0 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67  meters following
15f00 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20   the file-name. 
15f10 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   */.    flags |=
15f20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
15f30 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30  ;..    for(iIn=0
15f40 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b  ; iIn<nUri; iIn+
15f50 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72  +) nByte += (zUr
15f60 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20  i[iIn]=='&');.  
15f70 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
15f80 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
15f90 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
15fa0 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
15fb0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20  E_NOMEM_BKPT;.. 
15fc0 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64     iIn = 5;.#ifd
15fd0 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f  ef SQLITE_ALLOW_
15fe0 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20  URI_AUTHORITY.  
15ff0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55    if( strncmp(zU
16000 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d  ri+5, "///", 3)=
16010 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  =0 ){.      iIn 
16020 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  = 7;.      /* Th
16030 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64  e following cond
16040 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49  ition causes URI
16050 73 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64  s with five lead
16060 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73  ing / characters
16070 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66  .      ** like f
16080 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61  ile://///host/pa
16090 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74  th to be convert
160a0 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b  ed into UNCs lik
160b0 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20  e //host/path.. 
160c0 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72       ** The corr
160d0 65 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74  ect URI for that
160e0 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77   UNC has only tw
160f0 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e  o or four leadin
16100 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
16110 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68       ** file://h
16120 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65  ost/path or file
16130 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20  :////host/path. 
16140 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73   But 5 leading s
16150 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20  lashes is a .   
16160 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72     ** common err
16170 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c  or, we are told,
16180 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74   so we handle it
16190 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
161a0 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  se. */.      if(
161b0 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c   strncmp(zUri+7,
161c0 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b   "///", 3)==0 ){
161d0 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65   iIn++; }.    }e
161e0 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
161f0 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c  zUri+5, "//local
16200 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29  host/", 12)==0 )
16210 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36  {.      iIn = 16
16220 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
16230 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
16240 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68   scheme and auth
16250 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f  ority segments o
16260 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20  f the URI. */.  
16270 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27    if( zUri[5]=='
16280 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27  /' && zUri[6]=='
16290 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  /' ){.      iIn 
162a0 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 7;.      while
162b0 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
162c0 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20  Uri[iIn]!='/' ) 
162d0 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
162e0 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21   iIn!=7 && (iIn!
162f0 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c  =16 || memcmp("l
16300 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69  ocalhost", &zUri
16310 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20  [7], 9)) ){.    
16320 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
16330 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16340 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74  "invalid uri aut
16350 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a  hority: %.*s", .
16360 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d              iIn-
16370 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20  7, &zUri[7]);.  
16380 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16390 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
163a0 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
163b0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
163c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
163d0 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e  * Copy the filen
163e0 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72  ame and any quer
163f0 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74  y parameters int
16400 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66  o the zFile buff
16410 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f  er. .    ** Deco
16420 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f  de %HH escape co
16430 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  des along the wa
16440 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  y. .    **.    *
16450 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  * Within this lo
16460 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74  op, variable eSt
16470 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ate may be set t
16480 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70  o 0, 1 or 2, dep
16490 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  ending.    ** on
164a0 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
164b0 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  text. As follows
164c0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
164d0 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c    0: Parsing fil
164e0 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20  e-name..    **  
164f0 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65   1: Parsing name
16500 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
16510 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
16520 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a  arameter..    **
16530 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61     2: Parsing va
16540 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  lue section of a
16550 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
16560 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
16570 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d   */.    eState =
16580 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
16590 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
165a0 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20  0 && c!='#' ){. 
165b0 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
165c0 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20    if( c=='%' .  
165d0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
165e0 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
165f0 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  ]) .       && sq
16600 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
16610 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20  ri[iIn+1]) .    
16620 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
16630 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65   octet = (sqlite
16640 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
16650 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20  In++]) << 4);.  
16660 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73        octet += s
16670 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
16680 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20  Uri[iIn++]);..  
16690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
166a0 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c  tet>=0 && octet<
166b0 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  256 );.        i
166c0 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23  f( octet==0 ){.#
166d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
166e0 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f  ABLE_URI_00_ERRO
166f0 52 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  R.          /* T
16700 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
16710 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61  ken when "%00" a
16720 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68  ppears within th
16730 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20  e URI. In this. 
16740 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
16750 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74   we ignore all t
16760 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ext in the remai
16770 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68  nder of the path
16780 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20  , name or.      
16790 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72      ** value cur
167a0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72  rently being par
167b0 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  sed. So ignore t
167c0 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
167d0 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  cter.          *
167e0 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68  * and skip to th
167f0 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20  e next "?", "=" 
16800 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f  or "&", as appro
16810 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  priate. */.     
16820 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
16830 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
16840 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20  & c!='#' .      
16850 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
16860 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29  te!=0 || c!='?')
16870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
16880 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20  & (eState!=1 || 
16890 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26  (c!='=' && c!='&
168a0 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')).            
168b0 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20    && (eState!=2 
168c0 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20  || c!='&').     
168d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
168e0 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
168f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16900 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65   continue;.#else
16910 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
16920 20 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45   ENABLE_URI_00_E
16930 52 52 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c  RROR is defined,
16940 20 22 25 30 30 22 20 69 6e 20 61 20 55 52 49 20   "%00" in a URI 
16950 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a  is an error. */.
16960 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
16970 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
16980 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65  rintf("unexpecte
16990 64 20 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b  d %%00 in uri");
169a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
169b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
169c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
169d0 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64  se_uri_out;.#end
169e0 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
169f0 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
16a00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
16a10 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
16a20 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
16a30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
16a40 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
16a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
16a60 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
16a70 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
16a80 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
16a90 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
16aa0 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
16ab0 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
16ac0 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
16ad0 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
16ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
16af0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
16b00 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
16b10 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
16b20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
16b30 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
16b40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
16b50 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
16b60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
16b70 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
16b80 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
16b90 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
16ba0 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
16bb0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
16bc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
16bd0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
16be0 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
16bf0 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
16c00 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
16c10 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
16c20 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
16c30 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
16c40 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
16c50 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
16c60 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
16c70 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
16c80 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
16c90 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
16ca0 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
16cb0 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
16cc0 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
16cd0 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
16ce0 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
16cf0 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
16d00 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
16d10 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
16d20 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
16d30 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
16d40 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
16d50 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
16d60 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
16d70 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
16d80 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
16d90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
16da0 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
16db0 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
16dc0 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
16dd0 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
16de0 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
16df0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
16e00 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
16e10 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
16e20 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
16e30 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
16e40 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
16e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e60 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
16e70 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
16e80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
16e90 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
16ea0 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
16eb0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
16ec0 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
16ed0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
16ee0 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
16ef0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
16f00 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
16f10 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
16f20 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
16f30 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
16f40 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
16f50 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
16f60 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
16f70 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
16f80 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
16f90 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
16fa0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
16fb0 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
16fc0 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
16fd0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
16fe0 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
16ff0 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
17000 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
17010 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
17020 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
17030 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
17040 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
17050 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
17060 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
17070 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
17080 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
17090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
170a0 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
170b0 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
170c0 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
170d0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
170e0 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
170f0 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
17100 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
17110 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
17120 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
17130 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
17140 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17150 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
17160 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
17170 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17180 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
17190 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
171a0 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d            { "mem
171b0 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ory", SQLITE_OPE
171c0 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20  N_MEMORY },.    
171d0 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
171e0 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
171f0 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
17200 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17210 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50  ONLY | SQLITE_OP
17220 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  EN_READWRITE.   
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17240 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
17250 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
17260 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20  EN_MEMORY;.     
17270 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70       aMode = aOp
17280 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  enMode;.        
17290 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26    limit = mask &
172a0 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
172b0 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61    zModeType = "a
172c0 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20  ccess";.        
172d0 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  }..        if( a
172e0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
172f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
17300 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b     int mode = 0;
17310 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
17320 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20  =0; aMode[i].z; 
17330 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
17340 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
17350 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20  = aMode[i].z;.  
17360 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56            if( nV
17370 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  al==sqlite3Strle
17380 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d  n30(z) && 0==mem
17390 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61  cmp(zVal, z, nVa
173a0 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
173b0 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65      mode = aMode
173c0 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  [i].mode;.      
173d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
173e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
173f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17400 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29     if( mode==0 )
17410 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
17420 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
17430 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
17440 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c  ch %s mode: %s",
17450 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
17460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
17470 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
17480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
17490 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
174a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
174b0 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64          if( (mod
174c0 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  e & ~SQLITE_OPEN
174d0 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29  _MEMORY)>limit )
174e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
174f0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
17500 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
17510 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
17520 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
17550 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
17560 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
17570 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
17580 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
17590 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
175a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
175b0 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
175c0 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
175d0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
175e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
175f0 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
17600 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
17610 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
17620 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
17630 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20  Uri+2);.    if( 
17640 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
17650 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
17660 54 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  T;.    if( nUri 
17670 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
17680 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72  zFile, zUri, nUr
17690 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  i);.    }.    zF
176a0 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27  ile[nUri] = '\0'
176b0 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
176c0 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
176d0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
176e0 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a  _OPEN_URI;.  }..
176f0 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74    *ppVfs = sqlit
17700 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73  e3_vfs_find(zVfs
17710 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d  );.  if( *ppVfs=
17720 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  =0 ){.    *pzErr
17730 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
17740 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76  rintf("no such v
17750 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a  fs: %s", zVfs);.
17760 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17770 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73  ERROR;.  }. pars
17780 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28  e_uri_out:.  if(
17790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
177a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
177b0 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a  ee(zFile);.    z
177c0 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
177d0 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  *pFlags = flags;
177e0 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69  .  *pzFile = zFi
177f0 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  le;.  return rc;
17800 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
17810 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
17820 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67   work of opening
17830 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62   a database on b
17840 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69  ehalf of.** sqli
17850 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73  te3_open() and s
17860 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e  qlite3_open16().
17870 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
17880 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d  lename "zFilenam
17890 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38  e"  .** is UTF-8
178a0 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61   encoded..*/.sta
178b0 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61  tic int openData
178c0 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  base(.  const ch
178d0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f  ar *zFilename, /
178e0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
178f0 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ame UTF-8 encode
17900 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
17910 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a  *ppDb,        /*
17920 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64   OUT: Returned d
17930 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
17940 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
17950 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70   flags,    /* Op
17960 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20  erational flags 
17970 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
17980 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e  *zVfs       /* N
17990 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
179a0 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  o use */.){.  sq
179b0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
179d0 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64   Store allocated
179e0 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
179f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a10 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
17a20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65   */.  int isThre
17a30 61 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20  adsafe;         
17a40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
17a50 72 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e  r threadsafe con
17a60 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  nections */.  ch
17a70 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20  ar *zOpen = 0;  
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17a90 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65   Filename argume
17aa0 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74  nt to pass to Bt
17ab0 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63  reeOpen() */.  c
17ac0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
17ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17ae0 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
17af0 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73  from sqlite3Pars
17b00 65 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65  eUri() */..#ifde
17b10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17b20 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
17b30 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ppDb==0 ) return
17b40 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
17b50 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70  KPT;.#endif.  *p
17b60 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  pDb = 0;.#ifndef
17b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17b80 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
17b90 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
17ba0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
17bb0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
17bc0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
17bd0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
17be0 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Mutex==0 ){.    
17bf0 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
17c00 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
17c10 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
17c20 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20  N_NOMUTEX ){.   
17c30 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
17c40 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
17c50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
17c60 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a  EN_FULLMUTEX ){.
17c70 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
17c80 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
17c90 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
17ca0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
17cb0 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
17cc0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61  ;.  }..  if( fla
17cd0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
17ce0 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b  _PRIVATECACHE ){
17cf0 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
17d00 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
17d10 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20  DCACHE;.  }else 
17d20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
17d30 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
17d40 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
17d50 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
17d60 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
17d70 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  HE;.  }..  /* Re
17d80 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74  move harmful bit
17d90 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73  s from the flags
17da0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a   parameter.  **.
17db0 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    ** The SQLITE_
17dc0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64  OPEN_NOMUTEX and
17dd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
17de0 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72  LMUTEX flags wer
17df0 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  e.  ** dealt wit
17e00 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  h in the previou
17e10 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42  s code block.  B
17e20 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68  esides these, th
17e30 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69  e only.  ** vali
17e40 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f  d input flags fo
17e50 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
17e60 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f  2() are SQLITE_O
17e70 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20  PEN_READONLY,.  
17e80 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ** SQLITE_OPEN_R
17e90 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45  EADWRITE, SQLITE
17ea0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51  _OPEN_CREATE, SQ
17eb0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
17ec0 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49  CACHE,.  ** SQLI
17ed0 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
17ee0 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72  ACHE, and some r
17ef0 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53  eserved bits.  S
17f00 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
17f10 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
17f20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
17f30 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
17f40 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
17f50 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
17f60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17f70 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17f90 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
17fa0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
17fb0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
17fc0 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
17fd0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
17fe0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
17ff0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
18000 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
18010 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18030 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
18040 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
18050 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18060 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
18070 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
18080 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
18090 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
180b0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
180c0 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
180d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
180e0 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  ULLMUTEX |.     
180f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18100 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20  _OPEN_WAL.      
18110 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20         );..  /* 
18120 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
18130 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
18140 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
18150 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
18160 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20  sizeof(sqlite3) 
18170 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
18180 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
18190 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64  ;.  if( isThread
181a0 73 61 66 65 20 0a 23 69 66 64 65 66 20 53 51 4c  safe .#ifdef SQL
181b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49  ITE_ENABLE_MULTI
181c0 54 48 52 45 41 44 45 44 5f 43 48 45 43 4b 53 0a  THREADED_CHECKS.
181d0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f     || sqlite3Glo
181e0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
181f0 75 74 65 78 0a 23 65 6e 64 69 66 0a 20 20 29 7b  utex.#endif.  ){
18200 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d  .    db->mutex =
18210 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
18220 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
18230 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
18240 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30  if( db->mutex==0
18250 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18260 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20  3_free(db);.    
18270 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20    db = 0;.      
18280 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
18290 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
182a0 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 29  sThreadsafe==0 )
182b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
182c0 75 74 65 78 57 61 72 6e 4f 6e 43 6f 6e 74 65 6e  utexWarnOnConten
182d0 74 69 6f 6e 28 64 62 2d 3e 6d 75 74 65 78 29 3b  tion(db->mutex);
182e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
182f0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
18300 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
18310 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66  b->errMask = 0xf
18320 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32  f;.  db->nDb = 2
18330 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
18340 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
18350 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  Y;.  db->aDb = d
18360 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20  b->aDbStatic;.. 
18370 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
18380 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a  db->aLimit)==siz
18390 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20  eof(aHardLimit) 
183a0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  );.  memcpy(db->
183b0 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d  aLimit, aHardLim
183c0 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  it, sizeof(db->a
183d0 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61  Limit));.  db->a
183e0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
183f0 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
18400 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  S] = SQLITE_DEFA
18410 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  ULT_WORKER_THREA
18420 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f  DS;.  db->autoCo
18430 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e  mmit = 1;.  db->
18440 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31  nextAutovac = -1
18450 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d  ;.  db->szMmap =
18460 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18470 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64  nfig.szMmap;.  d
18480 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20  b->nextPagesize 
18490 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53  = 0;.  db->nMaxS
184a0 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46  orterMmap = 0x7F
184b0 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c  FFFFFF;.  db->fl
184c0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
184d0 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51  ortColNames | SQ
184e0 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
184f0 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63 68  er | SQLITE_Cach
18500 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66 69  eSpill.#if !defi
18510 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
18520 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  LT_AUTOMATIC_IND
18530 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45  EX) || SQLITE_DE
18540 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f  FAULT_AUTOMATIC_
18550 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20 20  INDEX.          
18560 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
18570 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66  AutoIndex.#endif
18580 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
18590 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e  ULT_CKPTFULLFSYN
185a0 43 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C.              
185b0 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74     | SQLITE_Ckpt
185c0 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66  FullFSync.#endif
185d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
185e0 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c  ULT_FILE_FORMAT<
185f0 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4.              
18600 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61     | SQLITE_Lega
18610 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66  cyFileFmt.#endif
18620 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18630 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
18640 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  SION.           
18650 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
18660 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e  oadExtension.#en
18670 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  dif.#if SQLITE_D
18680 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45  EFAULT_RECURSIVE
18690 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20  _TRIGGERS.      
186a0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
186b0 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a  ITE_RecTriggers.
186c0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
186d0 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
186e0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20  T_FOREIGN_KEYS) 
186f0 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  && SQLITE_DEFAUL
18700 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20  T_FOREIGN_KEYS. 
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  | SQLITE_Foreign
18730 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66 20  Keys.#endif.#if 
18740 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52  defined(SQLITE_R
18750 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45 44  EVERSE_UNORDERED
18760 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20 20  _SELECTS).      
18770 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
18780 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
18790 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
187a0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
187b0 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
187c0 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20 20  CHECK).         
187d0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
187e0 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64  _CellSizeCk.#end
187f0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
18800 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
18810 33 5f 54 4f 4b 45 4e 49 5a 45 52 29 0a 20 20 20  3_TOKENIZER).   
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18830 53 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e  SQLITE_Fts3Token
18840 69 7a 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20  izer.#endif.#if 
18850 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
18860 4e 41 42 4c 45 5f 51 50 53 47 29 0a 20 20 20 20  NABLE_QPSG).    
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
18880 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47  QLITE_EnableQPSG
18890 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a  .#endif.      ;.
188a0 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
188b0 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
188c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
188d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
188e0 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  LE.  sqlite3Hash
188f0 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Init(&db->aModul
18900 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
18910 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74   Add the default
18920 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
18930 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41  nce BINARY. BINA
18940 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74  RY works for bot
18950 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64  h UTF-8.  ** and
18960 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20   UTF-16, so add 
18970 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61  a version for ea
18980 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20  ch to avoid any 
18990 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a  unnecessary.  **
189a0 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68   conversions. Th
189b0 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61  e only error tha
189c0 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65  t can occur here
189d0 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   is a malloc() f
189e0 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ailure..  **.  *
189f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18a00 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c  -52786-44878 SQL
18a10 69 74 65 20 64 65 66 69 6e 65 73 20 74 68 72 65  ite defines thre
18a20 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61  e built-in colla
18a30 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ting.  ** functi
18a40 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ons:.  */.  crea
18a50 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
18a60 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
18a70 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
18a80 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
18a90 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
18aa0 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33  tion(db, sqlite3
18ab0 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54  StrBINARY, SQLIT
18ac0 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
18ad0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
18ae0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
18af0 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
18b00 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
18b10 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16LE, 0, binCol
18b20 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
18b30 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
18b40 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54   "NOCASE", SQLIT
18b50 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73  E_UTF8, 0, nocas
18b60 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20  eCollatingFunc, 
18b70 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
18b80 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d  ation(db, "RTRIM
18b90 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
18ba0 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c  (void*)1, binCol
18bb0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  lFunc, 0);.  if(
18bc0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18bd0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
18be0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
18bf0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18c00 52 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54 68  R-08308-17224 Th
18c10 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
18c20 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
18c30 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67   all.  ** string
18c40 73 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20  s is BINARY. .  
18c50 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f  */.  db->pDfltCo
18c60 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
18c70 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
18c80 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33  TE_UTF8, sqlite3
18c90 53 74 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  StrBINARY, 0);. 
18ca0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
18cb0 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
18cc0 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c  /* Parse the fil
18cd0 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65  ename/URI argume
18ce0 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c  nt.  **.  ** Onl
18cf0 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65  y allow sensible
18d00 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
18d10 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61   bits in the fla
18d20 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20  gs argument.  . 
18d30 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72   ** Throw an err
18d40 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65  or if any non-se
18d50 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  nse combination 
18d60 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a  is used.  If we.
18d70 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63    ** do not bloc
18d80 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e  k illegal combin
18d90 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20  ations here, it 
18da0 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20  could trigger.  
18db0 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ** assert() stat
18dc0 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72  ements in deeper
18dd0 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62   layers.  Sensib
18de0 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a  le combinations.
18df0 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20    ** are:.  **. 
18e00 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f   **  1:  SQLITE_
18e10 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  OPEN_READONLY.  
18e20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f  **  2:  SQLITE_O
18e30 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
18e40 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f  **  6:  SQLITE_O
18e50 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
18e60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
18e70 54 45 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  TE.  */.  db->op
18e80 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
18e90 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
18ea0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
18eb0 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73   == 0x01 );.  as
18ec0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
18ed0 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30  N_READWRITE == 0
18ee0 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x02 );.  assert(
18ef0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
18f00 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29  ATE    == 0x04 )
18f10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  ;.  testcase( (1
18f20 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
18f30 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c  02 ); /* READONL
18f40 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  Y */.  testcase(
18f50 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
18f60 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44  =0x04 ); /* READ
18f70 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63  WRITE */.  testc
18f80 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
18f90 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20  7))==0x40 ); /* 
18fa0 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
18fb0 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c  TE */.  if( ((1<
18fc0 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78  <(flags&7)) & 0x
18fd0 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  46)==0 ){.    rc
18fe0 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45   = SQLITE_MISUSE
18ff0 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20  _BKPT;  /* IMP: 
19000 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f  R-65497-44594 */
19010 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
19020 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
19030 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
19040 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
19050 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
19060 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
19070 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19080 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
19090 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
190a0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
190b0 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
190c0 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
190d0 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22   rc, zErrMsg ? "
190e0 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67  %s" : 0, zErrMsg
190f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19100 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
19110 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
19120 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  t;.  }..  /* Ope
19130 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
19140 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
19150 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
19160 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
19170 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64  s, zOpen, db, &d
19180 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
19190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
191a0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
191b0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
191c0 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
191d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
191e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
191f0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
19200 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19210 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19220 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
19230 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
19240 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
19250 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ut;.  }.  sqlite
19260 33 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e  3BtreeEnter(db->
19270 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
19280 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
19290 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
192a0 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
192b0 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20  [0].pBt);.  if( 
192c0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
192d0 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43  d ) ENC(db) = SC
192e0 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20  HEMA_ENC(db);.  
192f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19300 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
19310 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
19320 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
19330 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
19340 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  );..  /* The def
19350 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65  ault safety_leve
19360 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  l for the main d
19370 61 74 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b  atabase is FULL;
19380 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
19390 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
193a0 73 20 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63  s OFF. This matc
193b0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61  hes the pager la
193c0 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a  yer defaults.  .
193d0 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30    */.  db->aDb[0
193e0 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61  ].zDbSName = "ma
193f0 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
19400 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
19410 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
19420 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20  SYNCHRONOUS+1;. 
19430 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53   db->aDb[1].zDbS
19440 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
19450 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
19460 74 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52  ty_level = PAGER
19470 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
19480 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
19490 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
194a0 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
194b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
194c0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
194d0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
194e0 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
194f0 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
19500 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
19510 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
19520 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
19530 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
19540 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
19550 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
19560 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
19570 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
19580 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
19590 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
195a0 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
195b0 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69  PerConnectionBui
195c0 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
195d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
195e0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a  3_errcode(db);..
195f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19600 41 42 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52  ABLE_FTS5.  /* R
19610 65 67 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c  egister any buil
19620 74 2d 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65  t-in FTS5 module
19630 20 62 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20   before loading 
19640 74 68 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20  the automatic.  
19650 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54  ** extensions. T
19660 68 69 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d  his allows autom
19670 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
19680 74 6f 20 72 65 67 69 73 74 65 72 20 46 54 53 35  to register FTS5
19690 20 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72   .  ** tokenizer
196a0 73 20 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20  s and auxiliary 
196b0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20  functions.  */. 
196c0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
196d0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
196e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
196f0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
19700 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
19710 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61  dif..  /* Load a
19720 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
19730 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73  ons - extensions
19740 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
19750 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20  registered.  ** 
19760 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
19770 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65  3_automatic_exte
19780 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
19790 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
197a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
197b0 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65  ite3AutoLoadExte
197c0 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20  nsions(db);.    
197d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
197e0 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66  code(db);.    if
197f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19800 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  ){.      goto op
19810 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
19820 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
19830 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
19840 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
19850 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
19860 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
19870 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
19880 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
19890 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
198a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
198b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
198c0 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
198d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
198e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
198f0 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
19900 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
19910 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
19920 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
19930 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
19940 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
19950 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
19960 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  3 /* automatical
19970 6c 79 20 64 65 66 69 6e 65 64 20 62 79 20 53 51  ly defined by SQ
19980 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
19990 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   */.  if( !db->m
199a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
199b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
199c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
199d0 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts3Init(db);.  
199e0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
199f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
19a00 42 4c 45 5f 49 43 55 29 20 7c 7c 20 64 65 66 69  BLE_ICU) || defi
19a10 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
19a20 45 5f 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53  E_ICU_COLLATIONS
19a30 29 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ).  if( !db->mal
19a40 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
19a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19a60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
19a70 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
19a80 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
19a90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
19aa0 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
19ab0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
19ac0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
19ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
19ae0 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
19af0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
19b00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
19b10 41 47 45 5f 56 54 41 42 0a 20 20 69 66 28 20 21  AGE_VTAB.  if( !
19b20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19b30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
19b40 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
19b50 69 74 65 33 44 62 70 61 67 65 52 65 67 69 73 74  ite3DbpageRegist
19b60 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  er(db);.  }.#end
19b70 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
19b80 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f  E_ENABLE_DBSTAT_
19b90 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e  VTAB.  if( !db->
19ba0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
19bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
19bc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19bd0 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64  DbstatRegister(d
19be0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
19bf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19c00 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28  ABLE_JSON1.  if(
19c10 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
19c20 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
19c30 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
19c40 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28  qlite3Json1Init(
19c50 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
19c60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19c70 4e 41 42 4c 45 5f 53 54 4d 54 56 54 41 42 0a 20  NABLE_STMTVTAB. 
19c80 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
19c90 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
19ca0 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
19cb0 20 3d 20 73 71 6c 69 74 65 33 53 74 6d 74 56 74   = sqlite3StmtVt
19cc0 61 62 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  abInit(db);.  }.
19cd0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53  #endif..  /* -DS
19ce0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
19cf0 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
19d00 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
19d10 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
19d20 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
19d30 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
19d40 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
19d50 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
19d60 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
19d70 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
19d80 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
19d90 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
19da0 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
19db0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19dc0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
19dd0 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
19de0 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
19df0 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
19e00 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
19e10 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
19e20 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
19e30 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
19e40 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19e60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
19e70 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
19e80 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73  if..  if( rc ) s
19e90 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
19ea0 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c  rc);..  /* Enabl
19eb0 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
19ec0 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19ed0 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61   */.  setupLooka
19ee0 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69  side(db, 0, sqli
19ef0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f00 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20  szLookaside,.   
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
19f30 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
19f40 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ide);..  sqlite3
19f50 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
19f60 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  int(db, SQLITE_D
19f70 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
19f80 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65  HECKPOINT);..ope
19f90 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ndb_out:.  if( d
19fa0 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
19fb0 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
19fc0 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
19fd0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
19fe0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19ff0 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30  ig.bFullMutex==0
1a000 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1a010 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1a020 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63  mutex);.  }.  rc
1a030 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
1a040 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  de(db);.  assert
1a050 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  ( db!=0 || rc==S
1a060 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
1a070 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a080 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
1a090 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
1a0a0 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65      db = 0;.  }e
1a0b0 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
1a0c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
1a0d0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1a0e0 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a  MAGIC_SICK;.  }.
1a0f0 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69    *ppDb = db;.#i
1a100 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a110 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
1a120 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1a130 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
1a140 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20     /* Opening a 
1a150 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74  db handle. Fourt
1a160 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  h parameter is p
1a170 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20  assed 0. */.    
1a180 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c  void *pArg = sql
1a190 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a1a0 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20  .pSqllogArg;.   
1a1b0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a1c0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72  nfig.xSqllog(pAr
1a1d0 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65  g, db, zFilename
1a1e0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
1a1f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1a200 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20  ITE_HAS_CODEC). 
1a210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a220 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
1a230 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20  char *zKey;.    
1a240 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69  if( (zKey = sqli
1a250 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1a260 72 28 7a 4f 70 65 6e 2c 20 22 68 65 78 6b 65 79  r(zOpen, "hexkey
1a270 22 29 29 21 3d 30 20 26 26 20 7a 4b 65 79 5b 30  "))!=0 && zKey[0
1a280 5d 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42  ] ){.      u8 iB
1a290 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  yte;.      int i
1a2a0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 44 65  ;.      char zDe
1a2b0 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20 20  coded[40];.     
1a2c0 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d   for(i=0, iByte=
1a2d0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63  0; i<sizeof(zDec
1a2e0 6f 64 65 64 29 2a 32 20 26 26 20 73 71 6c 69 74  oded)*2 && sqlit
1a2f0 65 33 49 73 78 64 69 67 69 74 28 7a 4b 65 79 5b  e3Isxdigit(zKey[
1a300 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i]); i++){.     
1a310 20 20 20 69 42 79 74 65 20 3d 20 28 69 42 79 74     iByte = (iByt
1a320 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48  e<<4) + sqlite3H
1a330 65 78 54 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29  exToInt(zKey[i])
1a340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
1a350 26 31 29 21 3d 30 20 29 20 7a 44 65 63 6f 64 65  &1)!=0 ) zDecode
1a360 64 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a  d[i/2] = iByte;.
1a370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a380 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
1a390 20 30 2c 20 7a 44 65 63 6f 64 65 64 2c 20 69 2f   0, zDecoded, i/
1a3a0 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  2);.    }else if
1a3b0 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65  ( (zKey = sqlite
1a3c0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1a3d0 7a 4f 70 65 6e 2c 20 22 6b 65 79 22 29 29 21 3d  zOpen, "key"))!=
1a3e0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1a3f0 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c  e3_key_v2(db, 0,
1a400 20 7a 4b 65 79 2c 20 73 71 6c 69 74 65 33 53 74   zKey, sqlite3St
1a410 72 6c 65 6e 33 30 28 7a 4b 65 79 29 29 3b 0a 20  rlen30(zKey));. 
1a420 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1a430 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1a440 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  Open);.  return 
1a450 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  rc & 0xff;.}../*
1a460 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
1a470 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
1a480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
1a490 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
1a4a0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  r *zFilename, . 
1a4b0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20   sqlite3 **ppDb 
1a4c0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
1a4d0 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
1a4e0 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  ame, ppDb,.     
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a500 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1a510 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1a520 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
1a530 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
1a540 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20  pen_v2(.  const 
1a550 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
1a560 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1a570 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a  lename (UTF-8) *
1a580 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
1a590 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Db,         /* O
1a5a0 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61  UT: SQLite db ha
1a5b0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ndle */.  int fl
1a5c0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
1a5d0 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20    /* Flags */.  
1a5e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
1a5f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1a600 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f  of VFS module to
1a610 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   use */.){.  ret
1a620 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
1a630 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  (filename, ppDb,
1a640 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66   (unsigned int)f
1a650 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
1a660 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a670 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1a680 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
1a690 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
1a6a0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
1a6b0 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
1a6c0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
1a6d0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
1a6e0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1a6f0 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
1a700 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
1a710 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
1a720 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
1a730 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1a740 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
1a750 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a760 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1a770 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29  .  if( ppDb==0 )
1a780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1a790 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1a7a0 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  if.  *ppDb = 0;.
1a7b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a7c0 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
1a7d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
1a7e0 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
1a7f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a800 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69  #endif.  if( zFi
1a810 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c  lename==0 ) zFil
1a820 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30  ename = "\000\00
1a830 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  0";.  pVal = sql
1a840 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
1a850 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
1a860 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
1a870 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
1a880 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
1a890 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1a8a0 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
1a8b0 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
1a8c0 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
1a8d0 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
1a8e0 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
1a8f0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
1a900 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1a930 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
1a940 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
1a950 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1a960 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
1a970 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
1a980 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a990 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
1a9a0 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
1a9b0 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a9c0 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41   ){.      SCHEMA
1a9d0 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e  _ENC(*ppDb) = EN
1a9e0 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54  C(*ppDb) = SQLIT
1a9f0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
1aa00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1aa10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1aa20 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
1aa30 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
1aa40 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
1aa50 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23  n rc & 0xff;.}.#
1aa60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1aa70 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
1aa80 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1aa90 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
1aaa0 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
1aab0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1aac0 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
1aad0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1aae0 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
1aaf0 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
1ab00 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
1ab10 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
1ab20 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
1ab30 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
1ab40 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
1ab50 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
1ab60 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1ab70 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1ab80 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  n_v2(db, zName, 
1ab90 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
1aba0 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  are, 0);.}../*.*
1abb0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
1abc0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1abd0 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
1abe0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
1abf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1ac00 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1ac10 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
1ac20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
1ac30 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
1ac40 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
1ac50 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
1ac60 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
1ac70 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
1ac80 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
1ac90 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
1aca0 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
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 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1acd0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1ace0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1acf0 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  || zName==0 ) re
1ad00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1ad10 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1ad20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ad30 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1ad40 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
1ad50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1ad60 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
1ad70 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
1ad80 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  e, (u8)enc, pCtx
1ad90 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c  , xCompare, xDel
1ada0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1adb0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
1adc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1add0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1ade0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1adf0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1ae00 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
1ae10 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
1ae20 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
1ae30 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
1ae40 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
1ae50 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
1ae60 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1ae70 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a  on16(.  sqlite3*
1ae80 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f   db, .  const vo
1ae90 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  id *zName,.  int
1aea0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
1aeb0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
1aec0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
1aed0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
1aee0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
1aef0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1af00 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
1af10 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  ame8;..#ifdef SQ
1af20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1af30 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1af40 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1af50 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
1af60 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1af70 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1af80 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1af90 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1afa0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
1afb0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1afc0 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
1afd0 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
1afe0 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  8(db, zName, -1,
1aff0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
1b000 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  IVE);.  if( zNam
1b010 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  e8 ){.    rc = c
1b020 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
1b030 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65  b, zName8, (u8)e
1b040 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
1b050 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
1b060 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
1b070 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
1b080 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
1b090 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
1b0a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b0b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1b0c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1b0d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b0e0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
1b0f0 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
1b100 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
1b110 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
1b120 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1b130 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
1b140 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
1b150 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
1b160 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1b170 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
1b180 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
1b190 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
1b1a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
1b1b0 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
1b1c0 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
1b1d0 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
1b1e0 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
1b1f0 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
1b200 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53  ar*).){.#ifdef S
1b210 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1b220 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1b230 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1b240 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1b250 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1b260 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1b270 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1b280 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
1b290 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
1b2a0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
1b2b0 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
1b2c0 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
1b2d0 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
1b2e0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
1b2f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1b300 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1b310 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b320 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1b330 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1b340 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1b350 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
1b360 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
1b370 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
1b380 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
1b390 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
1b3a0 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
1b3b0 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
1b3c0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
1b3d0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1b3e0 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
1b3f0 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
1b400 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
1b410 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
1b420 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
1b430 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
1b440 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
1b450 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
1b460 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1b470 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1b480 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1b490 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1b4a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b4b0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1b4c0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1b4d0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1b4e0 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
1b4f0 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  llNeeded = 0;.  
1b500 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
1b510 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31  6 = xCollNeeded1
1b520 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  6;.  db->pCollNe
1b530 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
1b540 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
1b550 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b560 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1b570 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b580 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1b590 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1b5a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b5b0 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
1b5c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1b5d0 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61  tion is now an a
1b5e0 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75  nachronism. It u
1b5f0 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74  sed to be used t
1b600 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
1b610 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  .** malloc() fai
1b620 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65  lure, but SQLite
1b630 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61   now does this a
1b640 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f  utomatically..*/
1b650 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .int sqlite3_glo
1b660 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64  bal_recover(void
1b670 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
1b680 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
1b690 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
1b6a0 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
1b6b0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
1b6c0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
1b6d0 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f  autocommit.** mo
1b6e0 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
1b6f0 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41   if it is and FA
1b700 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74  LSE if not.  Aut
1b710 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20  ocommit mode is 
1b720 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  on.** by default
1b730 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73  .  Autocommit is
1b740 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42   disabled by a B
1b750 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61  EGIN statement a
1b760 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20  nd reenabled.** 
1b770 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d  by the next COMM
1b780 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a  IT or ROLLBACK..
1b790 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
1b7a0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71  et_autocommit(sq
1b7b0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
1b7c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1b7d0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1b7e0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1b7f0 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
1b800 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
1b810 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
1b820 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
1b830 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
1b840 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
1b850 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1b860 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
1b870 65 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f  e substitutes fo
1b880 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
1b890 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
1b8a0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
1b8b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
1b8c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20  QLITE_NOMEM and 
1b8d0 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
1b8e0 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
1b8f0 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74  s.  They serve t
1b900 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
1b910 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
1b920 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
1b930 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
1b940 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
1b950 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
1b960 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
1b970 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
1b980 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
1b990 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
1b9a0 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
1b9b0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
1b9c0 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
1b9d0 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
1b9e0 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
1b9f0 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
1ba00 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
1ba10 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72  sqlite3ReportErr
1ba20 6f 72 28 69 6e 74 20 69 45 72 72 2c 20 69 6e 74  or(int iErr, int
1ba30 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63   lineno, const c
1ba40 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73  har *zType){.  s
1ba50 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c  qlite3_log(iErr,
1ba60 20 22 25 73 20 61 74 20 6c 69 6e 65 20 25 64 20   "%s at line %d 
1ba70 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
1ba80 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
1ba90 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c  , lineno, 20+sql
1baa0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
1bab0 3b 0a 20 20 72 65 74 75 72 6e 20 69 45 72 72 3b  ;.  return iErr;
1bac0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  .}.int sqlite3Co
1bad0 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c  rruptError(int l
1bae0 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1baf0 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1bb00 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1bb10 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1bb20 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53  te3ReportError(S
1bb30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c  QLITE_CORRUPT, l
1bb40 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61 73 65  ineno, "database
1bb50 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d   corruption");.}
1bb60 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75  .int sqlite3Misu
1bb70 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  seError(int line
1bb80 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1bb90 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1bba0 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1bbb0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1bbc0 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  ReportError(SQLI
1bbd0 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e  TE_MISUSE, linen
1bbe0 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a  o, "misuse");.}.
1bbf0 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f  int sqlite3Canto
1bc00 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  penError(int lin
1bc10 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1bc20 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1bc30 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1bc40 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1bc50 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1bc60 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69  ITE_CANTOPEN, li
1bc70 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  neno, "cannot op
1bc80 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66  en file");.}.#if
1bc90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1bca0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
1bcb0 75 70 74 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74  uptPgnoError(int
1bcc0 20 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67   lineno, Pgno pg
1bcd0 6e 6f 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  no){.  char zMsg
1bce0 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [100];.  sqlite3
1bcf0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1bd00 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64  (zMsg), zMsg, "d
1bd10 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1bd20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 70 67 6e  on page %d", pgn
1bd30 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o);.  testcase( 
1bd40 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1bd50 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1bd60 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1bd70 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1bd80 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e  E_CORRUPT, linen
1bd90 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20  o, zMsg);.}.int 
1bda0 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f  sqlite3NomemErro
1bdb0 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
1bdc0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1bdd0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1bde0 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Log!=0 );.  retu
1bdf0 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74  rn sqlite3Report
1be00 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  Error(SQLITE_NOM
1be10 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d  EM, lineno, "OOM
1be20 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ");.}.int sqlite
1be30 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72  3IoerrnomemError
1be40 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
1be50 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1be60 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1be70 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  og!=0 );.  retur
1be80 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45  n sqlite3ReportE
1be90 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1bea0 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c  R_NOMEM, lineno,
1beb0 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22   "I/O OOM error"
1bec0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
1bed0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1bee0 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
1bef0 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76  * This is a conv
1bf00 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20  enience routine 
1bf10 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20  that makes sure 
1bf20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d  that all thread-
1bf30 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61  specific.** data
1bf40 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64   for this thread
1bf50 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f   has been deallo
1bf60 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  cated..**.** SQL
1bf70 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73  ite no longer us
1bf80 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  es thread-specif
1bf90 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20  ic data so this 
1bfa0 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61  routine is now a
1bfb0 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69  .** no-op.  It i
1bfc0 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68  s retained for h
1bfd0 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74  istorical compat
1bfe0 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  ibility..*/.void
1bff0 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
1c000 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d  cleanup(void){.}
1c010 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1c020 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72  eturn meta infor
1c030 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73  mation about a s
1c040 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f  pecific column o
1c050 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  f a database tab
1c060 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  le..** See comme
1c070 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20  nt in sqlite3.h 
1c080 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f  (sqlite.h.in) fo
1c090 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  r details..*/.in
1c0a0 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  t sqlite3_table_
1c0b0 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
1c0c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c0e0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  * Connection han
1c0f0 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
1c100 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20  har *zDbName,   
1c110 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1c120 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f   name or NULL */
1c130 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c140 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f  TableName,     /
1c150 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
1c160 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1c170 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a  olumnName,    /*
1c180 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
1c190 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
1c1a0 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a  zDataType,    /*
1c1b0 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65   OUTPUT: Declare
1c1c0 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20  d data type */. 
1c1d0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
1c1e0 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20  CollSeq,     /* 
1c1f0 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f  OUTPUT: Collatio
1c200 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
1c210 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75  */.  int *pNotNu
1c220 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
1c230 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
1c240 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   if NOT NULL con
1c250 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a  straint exists *
1c260 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72  /.  int *pPrimar
1c270 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  yKey,           
1c280 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1c290 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f  if column part o
1c2a0 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  f PK */.  int *p
1c2b0 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20  Autoinc         
1c2c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
1c2d0 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
1c2e0 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e  is auto-incremen
1c2f0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1c300 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1c310 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  g = 0;.  Table *
1c320 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  pTab = 0;.  Colu
1c330 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20  mn *pCol = 0;.  
1c340 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  int iCol = 0;.  
1c350 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74  char const *zDat
1c360 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  aType = 0;.  cha
1c370 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65  r const *zCollSe
1c380 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74  q = 0;.  int not
1c390 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  null = 0;.  int 
1c3a0 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a  primarykey = 0;.
1c3b0 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20    int autoinc = 
1c3c0 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  0;...#ifdef SQLI
1c3d0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1c3e0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1c3f0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1c400 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d  db) || zTableNam
1c410 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
1c420 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1c430 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
1c440 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  f..  /* Ensure t
1c450 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1c460 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64  ma has been load
1c470 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1c480 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1c490 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
1c4a0 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
1c4b0 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
1c4c0 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  e3Init(db, &zErr
1c4d0 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  Msg);.  if( SQLI
1c4e0 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
1c4f0 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
1c500 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
1c510 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71  e the table in q
1c520 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61  uestion */.  pTa
1c530 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
1c540 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e  able(db, zTableN
1c550 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  ame, zDbName);. 
1c560 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54   if( !pTab || pT
1c570 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
1c580 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
1c590 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
1c5a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
1c5b0 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77  the column for w
1c5c0 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71  hich info is req
1c5d0 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  uested */.  if( 
1c5e0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29  zColumnName==0 )
1c5f0 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66  {.    /* Query f
1c600 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  or existance of 
1c610 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  table only */.  
1c620 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
1c630 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
1c640 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
1c650 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
1c660 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
1c670 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
1c680 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
1c690 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d  l->zName, zColum
1c6a0 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
1c6b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c6c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1c6d0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  Col==pTab->nCol 
1c6e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  ){.      if( Has
1c6f0 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 73  Rowid(pTab) && s
1c700 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
1c710 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
1c720 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61        iCol = pTa
1c730 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
1c740 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30    pCol = iCol>=0
1c750 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   ? &pTab->aCol[i
1c760 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20  Col] : 0;.      
1c770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1c780 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
1c790 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
1c7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c7b0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1c7c0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f  lowing block sto
1c7d0 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66  res the meta inf
1c7e0 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
1c7f0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20  ll be returned. 
1c800 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65   ** to the calle
1c810 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  r in local varia
1c820 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20  bles zDataType, 
1c830 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c  zCollSeq, notnul
1c840 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20  l, primarykey.  
1c850 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20  ** and autoinc. 
1c860 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1c870 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73  ere are two poss
1c880 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20  ibilities:.  ** 
1c890 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65  .  **     1. The
1c8a0 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d   specified colum
1c8b0 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64  n name was rowid
1c8c0 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f  ", "oid" or "_ro
1c8d0 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20  wid_" .  **     
1c8e0 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20     and there is 
1c8f0 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65  no explicitly de
1c900 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d  clared IPK colum
1c910 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  n. .  **.  **   
1c920 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69    2. The table i
1c930 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64  s not a view and
1c940 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
1c950 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a   identified an .
1c960 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c    **        expl
1c970 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
1c980 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74  column. Copy met
1c990 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
1c9a0 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a  om *pCol..  */ .
1c9b0 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20    if( pCol ){.  
1c9c0 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71    zDataType = sq
1c9d0 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
1c9e0 70 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f  pCol,0);.    zCo
1c9f0 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
1ca00 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
1ca10 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c   = pCol->notNull
1ca20 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  !=0;.    primary
1ca30 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f  key  = (pCol->co
1ca40 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
1ca50 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20  _PRIMKEY)!=0;.  
1ca60 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
1ca70 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
1ca80 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1ca90 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
1caa0 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ent)!=0;.  }else
1cab0 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
1cac0 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
1cad0 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b   primarykey = 1;
1cae0 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c  .  }.  if( !zCol
1caf0 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c  lSeq ){.    zCol
1cb00 6c 53 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74  lSeq = sqlite3St
1cb10 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72  rBINARY;.  }..er
1cb20 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
1cb30 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
1cb40 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68  db);..  /* Wheth
1cb50 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  er the function 
1cb60 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f  call succeeded o
1cb70 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68  r failed, set th
1cb80 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
1cb90 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74  ers.  ** to what
1cba0 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c  ever their local
1cbb0 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f   counterparts co
1cbc0 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72  ntain. If an err
1cbd0 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20  or did occur,.  
1cbe0 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20  ** this has the 
1cbf0 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e  effect of zeroin
1cc00 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72  g all output par
1cc10 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
1cc20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29  if( pzDataType )
1cc30 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a   *pzDataType = z
1cc40 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20  DataType;.  if( 
1cc50 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43  pzCollSeq ) *pzC
1cc60 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65  ollSeq = zCollSe
1cc70 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c  q;.  if( pNotNul
1cc80 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20  l ) *pNotNull = 
1cc90 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70  notnull;.  if( p
1cca0 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50  PrimaryKey ) *pP
1ccb0 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d  rimaryKey = prim
1ccc0 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41  arykey;.  if( pA
1ccd0 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69  utoinc ) *pAutoi
1cce0 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20  nc = autoinc;.. 
1ccf0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
1cd00 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  rc && !pTab ){. 
1cd10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1cd20 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
1cd30 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
1cd40 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1cd50 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
1cd60 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a  olumn: %s.%s", z
1cd70 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
1cd80 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b     zColumnName);
1cd90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1cda0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
1cdb0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
1cdc0 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d  g(db, rc, (zErrM
1cdd0 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72  sg?"%s":0), zErr
1cde0 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1cdf0 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1ce00 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  g);.  rc = sqlit
1ce10 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
1ce20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1ce30 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1ce40 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1ce50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  ;.}../*.** Sleep
1ce60 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
1ce70 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
1ce80 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
1ce90 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  slept..*/.int sq
1cea0 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20  lite3_sleep(int 
1ceb0 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ms){.  sqlite3_v
1cec0 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20  fs *pVfs;.  int 
1ced0 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c  rc;.  pVfs = sql
1cee0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1cef0 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20  ;.  if( pVfs==0 
1cf00 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
1cf10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cf20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65  works in millise
1cf30 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75  conds, but the u
1cf40 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65  nderlying OsSlee
1cf50 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73  p() .  ** API us
1cf60 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e  es microseconds.
1cf70 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27   Hence the 1000'
1cf80 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28  s..  */.  rc = (
1cf90 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70  sqlite3OsSleep(p
1cfa0 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30  Vfs, 1000*ms)/10
1cfb0 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  00);.  return rc
1cfc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ;.}../*.** Enabl
1cfd0 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
1cfe0 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74   extended result
1cff0 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   codes..*/.int s
1d000 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
1d010 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c  result_codes(sql
1d020 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e  ite3 *db, int on
1d030 6f 66 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  off){.#ifdef SQL
1d040 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1d050 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1d060 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1d070 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1d080 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1d090 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1d0a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1d0b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
1d0c0 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66  >errMask = onoff
1d0d0 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
1d0e0 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  0xff;.  sqlite3_
1d0f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1d100 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1d110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d120 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
1d130 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74  xFileControl met
1d140 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75  hod on a particu
1d150 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  lar database..*/
1d160 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c  .int sqlite3_fil
1d170 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  e_control(sqlite
1d180 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1d190 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20  r *zDbName, int 
1d1a0 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1d1b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d1c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65  TE_ERROR;.  Btre
1d1d0 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64  e *pBtree;..#ifd
1d1e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1d1f0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1d200 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1d210 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
1d220 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1d230 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1d240 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1d250 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1d260 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69  .  pBtree = sqli
1d270 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1d280 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1d290 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1d2a0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1d2b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
1d2c0 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69  le *fd;.    sqli
1d2d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1d2e0 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65  tree);.    pPage
1d2f0 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
1d300 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Pager(pBtree);. 
1d310 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d320 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d  r!=0 );.    fd =
1d330 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
1d340 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  e(pPager);.    a
1d350 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a  ssert( fd!=0 );.
1d360 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
1d370 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f  TE_FCNTL_FILE_PO
1d380 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1d390 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29  (sqlite3_file**)
1d3a0 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20  pArg = fd;.     
1d3b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d3c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1d3d0 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
1d3e0 56 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20  VFS_POINTER ){. 
1d3f0 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 76       *(sqlite3_v
1d400 66 73 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  fs**)pArg = sqli
1d410 74 65 33 50 61 67 65 72 56 66 73 28 70 50 61 67  te3PagerVfs(pPag
1d420 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1d430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d440 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1d450 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41  ITE_FCNTL_JOURNA
1d460 4c 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  L_POINTER ){.   
1d470 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c     *(sqlite3_fil
1d480 65 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  e**)pArg = sqlit
1d490 65 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28  e3PagerJrnlFile(
1d4a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1d4b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d4c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d4d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1d4e0 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70  leControl(fd, op
1d4f0 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20  , pArg);.    }. 
1d500 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1d510 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1d520 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1d530 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1d540 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1d550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .}../*.** Interf
1d560 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69  ace to the testi
1d570 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74  ng logic..*/.int
1d580 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1d590 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e  ntrol(int op, ..
1d5a0 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1d5b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1d5c0 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 55 4e 55  UNTESTABLE.  UNU
1d5d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70  SED_PARAMETER(op
1d5e0 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69  );.#else.  va_li
1d5f0 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
1d600 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
1d610 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
1d620 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74  /*.    ** Save t
1d630 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1d640 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20   of the PRNG..  
1d650 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d660 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1d670 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20  NG_SAVE: {.     
1d680 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65   sqlite3PrngSave
1d690 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
1d6a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1d6b0 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f   /*.    ** Resto
1d6c0 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  re the state of 
1d6d0 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20  the PRNG to the 
1d6e0 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64  last state saved
1d6f0 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52   using.    ** PR
1d700 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e  NG_SAVE.  If PRN
1d710 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72  G_SAVE has never
1d720 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c   before been cal
1d730 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
1d740 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20   this verb acts 
1d750 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e  like PRNG_RESET.
1d760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d770 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d780 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b  _PRNG_RESTORE: {
1d790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
1d7a0 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29  ngRestoreState()
1d7b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d7c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1d7d0 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52   ** Reset the PR
1d7e0 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75  NG back to its u
1d7f0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61  ninitialized sta
1d800 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61  te.  The next ca
1d810 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
1d820 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1d830 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68  ) will reseed th
1d840 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73  e PRNG using a s
1d850 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a  ingle call.    *
1d860 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d  * to the xRandom
1d870 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74  ness method of t
1d880 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a  he default VFS..
1d890 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1d8a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d8b0 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20  PRNG_RESET: {.  
1d8c0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
1d8d0 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20  omness(0,0);.   
1d8e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d8f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1d900 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d910 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54  trol(BITVEC_TEST
1d920 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29  , size, program)
1d930 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1d940 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73  un a test agains
1d950 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63  t a Bitvec objec
1d960 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20  t of size.  The 
1d970 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74  program argument
1d980 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72  .    ** is an ar
1d990 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
1d9a0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1d9b0 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d   test.  Return -
1d9c0 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65  1 on a.    ** me
1d9d0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1d9e0 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63  error, 0 on succ
1d9f0 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  ess, or non-zero
1da00 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
1da10 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71     ** See the sq
1da20 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
1da30 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64  inTest() for add
1da40 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1da50 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1da60 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1da70 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
1da80 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  : {.      int sz
1da90 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1daa0 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  t);.      int *a
1dab0 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  Prog = va_arg(ap
1dac0 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72  , int*);.      r
1dad0 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
1dae0 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c  cBuiltinTest(sz,
1daf0 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62   aProg);.      b
1db00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1db10 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1db20 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1db30 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20  (FAULT_INSTALL, 
1db40 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a  xCallback).    *
1db50 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65  *.    ** Arrange
1db60 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c   to invoke xCall
1db70 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20  back() whenever 
1db80 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1db90 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20  ) is called,.   
1dba0 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b   ** if xCallback
1dbb0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
1dbc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61    **.    ** As a
1dbd0 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61 75   test of the fau
1dbe0 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63  lt simulator mec
1dbf0 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73  hanism itself, s
1dc00 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1dc10 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c  ).    ** is call
1dc20 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
1dc30 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20  fter installing 
1dc40 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b  the new callback
1dc50 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a   and the return.
1dc60 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f      ** value fro
1dc70 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  m sqlite3FaultSi
1dc80 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65  m(0) becomes the
1dc90 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20   return from.   
1dca0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   ** sqlite3_test
1dcb0 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20  _control()..    
1dcc0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1dcd0 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c  TE_TESTCTRL_FAUL
1dce0 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20  T_INSTALL: {.   
1dcf0 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69     /* MSVC is pi
1dd00 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e  cky about pullin
1dd10 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d  g func ptrs from
1dd20 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20   va lists..     
1dd30 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f   ** http://suppo
1dd40 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d  rt.microsoft.com
1dd50 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20  /kb/47961.      
1dd60 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
1dd70 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c  Config.xTestCall
1dd80 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70  back = va_arg(ap
1dd90 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a  , int(*)(int));.
1dda0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
1ddb0 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54  ypedef int(*TEST
1ddc0 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28  CALLBACKFUNC_t)(
1ddd0 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
1dde0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ddf0 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20  xTestCallback = 
1de00 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43  va_arg(ap, TESTC
1de10 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a  ALLBACKFUNC_t);.
1de20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1de30 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20  e3FaultSim(0);. 
1de40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1de50 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1de60 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1de70 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41  ontrol(BENIGN_MA
1de80 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67  LLOC_HOOKS, xBeg
1de90 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a  in, xEnd).    **
1dea0 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72  .    ** Register
1deb0 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74   hooks to call t
1dec0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  o indicate which
1ded0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1dee0 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62  es .    ** are b
1def0 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  enign..    */.  
1df00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1df10 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
1df20 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20  LLOC_HOOKS: {.  
1df30 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
1df40 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e   (*void_function
1df50 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76  )(void);.      v
1df60 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
1df70 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20  nignBegin;.     
1df80 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
1df90 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20  BenignEnd;.     
1dfa0 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20   xBenignBegin = 
1dfb0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
1dfc0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
1dfd0 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61   xBenignEnd = va
1dfe0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
1dff0 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  nction);.      s
1e000 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c  qlite3BenignMall
1e010 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42  ocHooks(xBenignB
1e020 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64  egin, xBenignEnd
1e030 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e040 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1e050 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1e060 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1e070 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
1e080 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65  NG_BYTE, unsigne
1e090 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  d int X).    **.
1e0a0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50      ** Set the P
1e0b0 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74  ENDING byte to t
1e0c0 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
1e0d0 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30  argument, if X>0
1e0e0 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f  ..    ** Make no
1e0f0 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30   changes if X==0
1e100 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  .  Return the va
1e110 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69  lue of the pendi
1e120 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61  ng byte.    ** a
1e130 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65  s it existing be
1e140 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1e150 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  e was called..  
1e160 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f    **.    ** IMPO
1e170 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67  RTANT:  Changing
1e180 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1e190 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30  e from 0x4000000
1e1a0 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20  0 results in.   
1e1b0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   ** an incompati
1e1c0 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ble database fil
1e1d0 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67  e format.  Chang
1e1e0 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
1e1f0 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  byte.    ** whil
1e200 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63  e any database c
1e210 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
1e220 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64  n results in und
1e230 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a  efined and.    *
1e240 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65  * deleterious be
1e250 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  havior..    */. 
1e260 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1e270 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1e280 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63  BYTE: {.      rc
1e290 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
1e2a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e2b0 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b  OMIT_WSD.      {
1e2c0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1e2d0 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76  d int newVal = v
1e2e0 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
1e2f0 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ed int);.       
1e300 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71   if( newVal ) sq
1e310 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65  lite3PendingByte
1e320 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20   = newVal;.     
1e330 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1e340 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e350 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1e360 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e370 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e380 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29  L_ASSERT, int X)
1e390 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1e3a0 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
1e3b0 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
1e3c0 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
1e3d0 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a  er or not.    **
1e3e0 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e   assert() was en
1e3f0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
1e400 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20  -time.  If X is 
1e410 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28  true and assert(
1e420 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62  ).    ** is enab
1e430 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
1e440 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72  turn value is tr
1e450 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  ue.  If X is tru
1e460 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73  e and.    ** ass
1e470 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1e480 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
1e490 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
1e4a0 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a  .  If X is.    *
1e4b0 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  * false and asse
1e4c0 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c  rt() is enabled,
1e4d0 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74   then the assert
1e4e0 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68  ion fires and th
1e4f0 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
1e500 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69   aborts.  If X i
1e510 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  s false and asse
1e520 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1e530 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
1e540 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1e550 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  s zero..    */. 
1e560 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1e570 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20  ESTCTRL_ASSERT: 
1e580 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65  {.      volatile
1e590 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20   int x = 0;.    
1e5a0 20 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64 65    assert( /*side
1e5b0 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78  -effects-ok*/ (x
1e5c0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1e5d0 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
1e5e0 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65  c = x;.      bre
1e5f0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1e600 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1e610 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e620 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e630 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20  ALWAYS, int X). 
1e640 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1e650 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
1e660 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
1e670 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65  t to see how the
1e680 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20   ALWAYS and.    
1e690 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20  ** NEVER macros 
1e6a0 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20  were defined at 
1e6b0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20  compile-time..  
1e6c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1e6d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1e6e0 41 4c 57 41 59 53 28 58 29 20 69 66 20 58 20 69  ALWAYS(X) if X i
1e6f0 73 20 74 72 75 65 2c 20 6f 72 20 30 20 69 66 20  s true, or 0 if 
1e700 58 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  X is false..    
1e710 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
1e720 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69  commended test i
1e730 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20  s X==2.  If the 
1e740 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1e750 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  2, that means.  
1e760 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e    ** ALWAYS() an
1e770 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f  d NEVER() are bo
1e780 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  th no-op pass-th
1e790 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68  rough macros, wh
1e7a0 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ich is the.    *
1e7b0 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  * default settin
1e7c0 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  g.  If the retur
1e7d0 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68  n value is 1, th
1e7e0 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65  en ALWAYS() is e
1e7f0 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72  ither.    ** har
1e800 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20  d-coded to true 
1e810 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72  or else it asser
1e820 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65  ts if its argume
1e830 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20  nt is false..   
1e840 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65   ** The first be
1e850 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64  havior (hard-cod
1e860 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74  ed to true) is t
1e870 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
1e880 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
1e890 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
1e8a0 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
1e8b0 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65  disabled and the
1e8c0 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62   second.    ** b
1e8d0 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20  ehavior (assert 
1e8e0 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
1e8f0 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66  to ALWAYS() is f
1e900 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73  alse) is the cas
1e910 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
1e920 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1e930 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
1e940 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
1e950 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1e960 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65   The run-time te
1e970 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67  st procedure mig
1e980 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e  ht look somethin
1e990 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  g like this:.   
1e9a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66   **.    **    if
1e9b0 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
1e9c0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1e9d0 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32  STCTRL_ALWAYS, 2
1e9e0 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20  )==2 ){.    **  
1e9f0 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20      // ALWAYS() 
1ea00 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
1ea10 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
1ea20 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a  gh macros.    **
1ea30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1ea40 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1ea50 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1ea60 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b  RL_ASSERT, 1) ){
1ea70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1ea80 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74  ALWAYS(x) assert
1ea90 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65  s that x is true
1eaa0 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72  . NEVER(x) asser
1eab0 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20  ts x is false.. 
1eac0 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a     **    }else{.
1ead0 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1eae0 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f  LWAYS(x) is a co
1eaf0 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52  nstant 1.  NEVER
1eb00 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
1eb10 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  t 0..    **    }
1eb20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1eb30 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1eb40 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20  _ALWAYS: {.     
1eb50 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
1eb60 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72  ap,int);.      r
1eb70 63 20 3d 20 78 20 3f 20 41 4c 57 41 59 53 28 78  c = x ? ALWAYS(x
1eb80 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ) : 0;.      bre
1eb90 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1eba0 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74  *.    **   sqlit
1ebb0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ebc0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ebd0 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20  BYTEORDER);.    
1ebe0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e  **.    ** The in
1ebf0 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72  teger returned r
1ec00 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d  eveals the byte-
1ec10 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d  order of the com
1ec20 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20  puter on which. 
1ec30 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20     ** SQLite is 
1ec40 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a  running:.    **.
1ec50 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20      **       1  
1ec60 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20     big-endian,  
1ec70 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20    determined at 
1ec80 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  run-time.    ** 
1ec90 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74       10     litt
1eca0 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72  le-endian, deter
1ecb0 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  mined at run-tim
1ecc0 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31  e.    **  432101
1ecd0 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
1ece0 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
1ecf0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20  t compile-time. 
1ed00 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20     **  123410   
1ed10 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1ed20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63   determined at c
1ed30 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20  ompile-time.    
1ed40 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c  */ .    case SQL
1ed50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54  ITE_TESTCTRL_BYT
1ed60 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20  EORDER: {.      
1ed70 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45  rc = SQLITE_BYTE
1ed80 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49  ORDER*100 + SQLI
1ed90 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a  TE_LITTLEENDIAN*
1eda0 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45  10 + SQLITE_BIGE
1edb0 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65  NDIAN;.      bre
1edc0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1edd0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1ede0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1edf0 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
1ee00 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
1ee10 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
1ee20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73   ** Set the nRes
1ee30 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66  erve size to N f
1ee40 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
1ee50 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61  base on the data
1ee60 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e  base.    ** conn
1ee70 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a  ection db..    *
1ee80 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1ee90 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
1eea0 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
1eeb0 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1eec0 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1eed0 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
1eee0 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
1eef0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1ef00 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1ef10 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
1ef20 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
1ef30 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
1ef40 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20  , 0, x, 0);.    
1ef50 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ef60 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1ef70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ef80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
1ef90 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1efa0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1efb0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
1efc0 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
1efd0 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
1efe0 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   ** Enable or di
1eff0 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70  sable various op
1f000 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20  timizations for 
1f010 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
1f020 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61  .  The .    ** a
1f030 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62  rgument N is a b
1f040 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69  itmask of optimi
1f050 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69  zations to be di
1f060 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72  sabled.  For nor
1f070 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  mal.    ** opera
1f080 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65  tion N should be
1f090 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73   0.  The idea is
1f0a0 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f   that a test pro
1f0b0 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20  gram (like the. 
1f0c0 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20     ** SQL Logic 
1f0d0 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74  Test or SLT test
1f0e0 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e   module) can run
1f0f0 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75   the same SQL mu
1f100 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20  ltiple times.   
1f110 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73   ** with various
1f120 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64   optimizations d
1f130 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66  isabled to verif
1f140 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  y that the same 
1f150 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73  answer.    ** is
1f160 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65   obtained in eve
1f170 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  ry case..    */.
1f180 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f190 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1f1a0 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20  ATIONS: {.      
1f1b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
1f1c0 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
1f1d0 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62  *);.      db->db
1f1e0 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29  OptFlags = (u16)
1f1f0 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29  (va_arg(ap, int)
1f200 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20   & 0xffff);.    
1f210 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1f220 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1f230 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1f240 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
1f250 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69  CALTIME_FAULT, i
1f260 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a  nt onoff);.    *
1f270 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61  *.    ** If para
1f280 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e  meter onoff is n
1f290 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75  on-zero, configu
1f2a0 72 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20  re the wrappers 
1f2b0 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20  so that all.    
1f2c0 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ** subsequent ca
1f2d0 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65  lls to localtime
1f2e0 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20  () and variants 
1f2f0 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69  fail. If onoff i
1f300 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75  s zero,.    ** u
1f310 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67  ndo this setting
1f320 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1f330 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1f340 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
1f350 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1f360 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1f370 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d  LocaltimeFault =
1f380 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1f390 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f3a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1f3b0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f3c0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f3d0 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
1f3e0 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a  T, int);.    **.
1f3f0 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c      ** Set or cl
1f400 65 61 72 20 61 20 66 6c 61 67 20 74 68 61 74 20  ear a flag that 
1f410 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1f420 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f430 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d   is always well-
1f440 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61  .    ** formed a
1f450 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74  nd never corrupt
1f460 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20  .  This flag is 
1f470 63 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c 74  clear by default
1f480 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
1f490 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  t.    ** databas
1f4a0 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61  e files might ha
1f4b0 76 65 20 61 72 62 69 74 72 61 72 79 20 63 6f 72  ve arbitrary cor
1f4c0 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e  ruption.  Settin
1f4d0 67 20 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e  g the flag durin
1f4e0 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67  g.    ** testing
1f4f0 20 63 61 75 73 65 73 20 63 65 72 74 61 69 6e 20   causes certain 
1f500 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1f510 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20  nts in the code 
1f520 74 6f 20 62 65 20 61 63 74 69 76 61 74 65 64 0a  to be activated.
1f530 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f      ** that demo
1f540 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74  nstrat invariant
1f550 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  s on well-formed
1f560 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
1f570 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1f580 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1f590 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20  _NEVER_CORRUPT: 
1f5a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1f5b0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65  lobalConfig.neve
1f5c0 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72  rCorrupt = va_ar
1f5d0 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1f5e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1f5f0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 74      /* Set the t
1f600 68 72 65 73 68 6f 6c 64 20 61 74 20 77 68 69 63  hreshold at whic
1f610 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e 74 65  h OP_Once counte
1f620 72 73 20 72 65 73 65 74 20 62 61 63 6b 20 74 6f  rs reset back to
1f630 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 20 42 79   zero..    ** By
1f640 20 64 65 66 61 75 6c 74 20 74 68 69 73 20 69 73   default this is
1f650 20 30 78 37 66 66 66 66 66 66 65 20 28 6f 76 65   0x7ffffffe (ove
1f660 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c 20 62 75  r 2 billion), bu
1f670 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 73 0a  t that value is.
1f680 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69 67 20 74      ** too big t
1f690 6f 20 74 65 73 74 20 69 6e 20 61 20 72 65 61 73  o test in a reas
1f6a0 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74 20 6f 66  onable amount of
1f6b0 20 74 69 6d 65 2c 20 73 6f 20 74 68 69 73 20 63   time, so this c
1f6c0 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20 20 2a 2a  ontrol is.    **
1f6d0 20 70 72 6f 76 69 64 65 64 20 74 6f 20 73 65 74   provided to set
1f6e0 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20 65 61 73   a small and eas
1f6f0 69 6c 79 20 72 65 61 63 68 61 62 6c 65 20 72 65  ily reachable re
1f700 73 65 74 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a  set value..    *
1f710 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1f720 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e 43 45 5f  E_TESTCTRL_ONCE_
1f730 52 45 53 45 54 5f 54 48 52 45 53 48 4f 4c 44 3a  RESET_THRESHOLD:
1f740 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1f750 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 4f 6e  GlobalConfig.iOn
1f760 63 65 52 65 73 65 74 54 68 72 65 73 68 6f 6c 64  ceResetThreshold
1f770 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1f780 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1f790 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1f7a0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f7b0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1f7c0 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52  TCTRL_VDBE_COVER
1f7d0 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20  AGE, xCallback, 
1f7e0 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ptr);.    **.   
1f7f0 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42 45   ** Set the VDBE
1f800 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61   coverage callba
1f810 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78  ck function to x
1f820 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f  Callback with co
1f830 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f  ntext .    ** po
1f840 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a  inter ptr..    *
1f850 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1f860 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f  E_TESTCTRL_VDBE_
1f870 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64  COVERAGE: {.#ifd
1f880 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1f890 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 74 79  OVERAGE.      ty
1f8a0 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61  pedef void (*bra
1f8b0 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f  nch_callback)(vo
1f8c0 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a  id*,int,u8,u8);.
1f8d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1f8e0 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42  balConfig.xVdbeB
1f8f0 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ranch = va_arg(a
1f900 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63  p,branch_callbac
1f910 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
1f920 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56  3GlobalConfig.pV
1f930 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76  dbeBranchArg = v
1f940 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b  a_arg(ap,void*);
1f950 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
1f960 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1f970 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1f980 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1f990 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
1f9a0 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29  _MMAP, db, nMax)
1f9b0 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  ; */.    case SQ
1f9c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
1f9d0 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20  RTER_MMAP: {.   
1f9e0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1f9f0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1fa00 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
1fa10 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
1fa20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1fa30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fa40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1fa50 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1fa60 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1fa70 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20  CTRL_ISINIT);.  
1fa80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75    **.    ** Retu
1fa90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1faa0 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20  SQLite has been 
1fab0 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
1fac0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a  SQLITE_ERROR if.
1fad0 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20      ** not..    
1fae0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1faf0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
1fb00 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IT: {.      if( 
1fb10 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1fb20 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20  fig.isInit==0 ) 
1fb30 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1fb40 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1fb50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
1fb60 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1fb70 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1fb80 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62  TRL_IMPOSTER, db
1fb90 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c  , dbName, onOff,
1fba0 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20   tnum);.    **. 
1fbb0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
1fbc0 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20  control is used 
1fbd0 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74  to create impost
1fbe0 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22  er tables.  "db"
1fbf0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20   is a pointer.  
1fc00 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
1fc10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1fc20 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20    dbName is the 
1fc30 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65  database name (e
1fc40 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20  x: "main" or.   
1fc50 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63   ** "temp") whic
1fc60 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74  h will receive t
1fc70 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f  he imposter.  "o
1fc80 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f  nOff" turns impo
1fc90 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20  ster mode on.   
1fca0 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e   ** or off.  "tn
1fcb0 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20  um" is the root 
1fcc0 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1fcd0 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ee to which the 
1fce0 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20  imposter.    ** 
1fcf0 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  table should con
1fd00 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nect..    **.   
1fd10 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73   ** Enable impos
1fd20 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68  ter mode only wh
1fd30 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  en the schema ha
1fd40 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
1fd50 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20  arsed.  Then.   
1fd60 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65   ** run a single
1fd70 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
1fd80 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74  atement to const
1fd90 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65  ruct the imposte
1fda0 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a  r table in.    *
1fdb0 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63 68  * the parsed sch
1fdc0 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20  ema.  Then turn 
1fdd0 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61  imposter mode ba
1fde0 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20  ck off again..  
1fdf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f    **.    ** If o
1fe00 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d  nOff==0 and tnum
1fe10 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  >0 then reset th
1fe20 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c  e schema for all
1fe30 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75 73   databases, caus
1fe40 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ing.    ** the s
1fe50 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61  chema to be repa
1fe60 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  rsed the next ti
1fe70 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e  me it is needed.
1fe80 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 20    This has the. 
1fe90 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20     ** effect of 
1fea0 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f  erasing all impo
1feb0 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20  ster tables..   
1fec0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1fed0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
1fee0 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  OSTER: {.      s
1fef0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1ff00 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1ff10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ff20 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1ff30 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64  >mutex);.      d
1ff40 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71  b->init.iDb = sq
1ff50 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
1ff60 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f  db, va_arg(ap,co
1ff70 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
1ff80 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79     db->init.busy
1ff90 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f   = db->init.impo
1ffa0 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61  sterTable = va_a
1ffb0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1ffc0 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e    db->init.newTn
1ffd0 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  um = va_arg(ap,i
1ffe0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  nt);.      if( d
1fff0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
20000 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
20010 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  num>0 ){.       
20020 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
20030 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
20040 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ion(db);.      }
20050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
20060 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
20070 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
20080 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  ak;.    }..#if d
20090 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47  efined(YYCOVERAG
200a0 45 29 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  E).    /*  sqlit
200b0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
200c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
200d0 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45 2c  PARSER_COVERAGE,
200e0 20 46 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20 20   FILE *out).    
200f0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  **.    ** This t
20100 65 73 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e 6c  est control (onl
20110 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e  y available when
20120 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
20130 6c 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  led with.    ** 
20140 2d 44 59 59 43 4f 56 45 52 41 47 45 29 20 77 72  -DYYCOVERAGE) wr
20150 69 74 65 73 20 61 20 72 65 70 6f 72 74 20 6f 6e  ites a report on
20160 74 6f 20 22 6f 75 74 22 20 74 68 61 74 20 73 68  to "out" that sh
20170 6f 77 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  ows all.    ** s
20180 74 61 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20 63  tate/lookahead c
20190 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20 74  ombinations in t
201a0 68 65 20 70 61 72 73 65 72 20 73 74 61 74 65 20  he parser state 
201b0 6d 61 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20 77  machine.    ** w
201c0 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 65  hich are never e
201d0 78 65 72 63 69 73 65 64 2e 20 20 49 66 20 61 6e  xercised.  If an
201e0 79 20 73 74 61 74 65 20 69 73 20 6d 69 73 73 65  y state is misse
201f0 64 2c 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  d, make the.    
20200 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53  ** return code S
20210 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 20  QLITE_ERROR..   
20220 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
20230 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41 52  ITE_TESTCTRL_PAR
20240 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a  SER_COVERAGE: {.
20250 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20        FILE *out 
20260 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 46 49 4c  = va_arg(ap, FIL
20270 45 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  E*);.      if( s
20280 71 6c 69 74 65 33 50 61 72 73 65 72 43 6f 76 65  qlite3ParserCove
20290 72 61 67 65 28 6f 75 74 29 20 29 20 72 63 20 3d  rage(out) ) rc =
202a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
202b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
202c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
202d0 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45 29 20  ned(YYCOVERAGE) 
202e0 2a 2f 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  */.  }.  va_end(
202f0 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ap);.#endif /* S
20300 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45  QLITE_UNTESTABLE
20310 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
20320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
20330 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74  s a utility rout
20340 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56  ine, useful to V
20350 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
20360 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a  ns, that checks.
20370 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64  ** to see if a d
20380 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73  atabase file was
20390 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74   a URI that cont
203a0 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63  ained a specific
203b0 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d   query .** param
203c0 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20  eter, and if so 
203d0 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  obtains the valu
203e0 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70  e of the query p
203f0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
20400 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
20410 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
20420 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70  lename pointer p
20430 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78  assed into the x
20440 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Open().** method
20450 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d   of a VFS implem
20460 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a  entation.  The z
20470 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69  Param argument i
20480 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
20490 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d  e.** query param
204a0 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54  eter we seek.  T
204b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
204c0 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  rns the value of
204d0 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70   the zParam.** p
204e0 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65  arameter if it e
204f0 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70  xists.  If the p
20500 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f  arameter does no
20510 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f  t exist, this ro
20520 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
20530 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e   a NULL pointer.
20540 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
20550 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
20560 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  meter(const char
20570 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
20580 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29  st char *zParam)
20590 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  {.  if( zFilenam
205a0 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d  e==0 || zParam==
205b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
205c0 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
205d0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
205e0 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77  lename) + 1;.  w
205f0 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b  hile( zFilename[
20600 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  0] ){.    int x 
20610 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  = strcmp(zFilena
20620 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20  me, zParam);.   
20630 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
20640 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
20650 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
20660 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74    if( x==0 ) ret
20670 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  urn zFilename;. 
20680 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
20690 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
206a0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
206b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
206c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
206d0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  a boolean value 
206e0 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
206f0 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  meter..*/.int sq
20700 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
20710 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
20720 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
20730 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74  har *zParam, int
20740 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74   bDflt){.  const
20750 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
20760 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
20770 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
20780 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62  am);.  bDflt = b
20790 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72  Dflt!=0;.  retur
207a0 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74  n z ? sqlite3Get
207b0 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74  Boolean(z, bDflt
207c0 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  ) : bDflt;.}../*
207d0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d  .** Return a 64-
207e0 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
207f0 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
20800 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69  rameter..*/.sqli
20810 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
20820 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63  3_uri_int64(.  c
20830 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
20840 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65  name,    /* File
20850 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74  name as passed t
20860 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e  o xOpen */.  con
20870 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
20880 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61         /* URI pa
20890 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a  rameter sought *
208a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
208b0 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a  4 bDflt       /*
208c0 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d   return if param
208d0 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  eter is missing 
208e0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
208f0 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
20900 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46  uri_parameter(zF
20910 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
20920 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
20930 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20  4 v;.  if( z && 
20940 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
20950 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 30 20 29  oI64(z, &v)==0 )
20960 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b  {.    bDflt = v;
20970 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44  .  }.  return bD
20980 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
20990 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20 70  turn the Btree p
209a0 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65  ointer identifie
209b0 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52  d by zDbName.  R
209c0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
209d0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65  t found..*/.Btre
209e0 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65  e *sqlite3DbName
209f0 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33 20  ToBtree(sqlite3 
20a00 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
20a10 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  *zDbName){.  int
20a20 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20 3f   iDb = zDbName ?
20a30 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
20a40 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 20  me(db, zDbName) 
20a50 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 69 44  : 0;.  return iD
20a60 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61 44  b<0 ? 0 : db->aD
20a70 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a 2f  b[iDb].pBt;.}../
20a80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20a90 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
20aa0 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
20ab0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
20ac0 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
20ad0 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
20ae0 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
20af0 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
20b00 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
20b10 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
20b20 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51   *pBt;.#ifdef SQ
20b30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
20b40 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
20b50 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
20b60 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
20b70 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
20b80 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
20b90 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
20ba0 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44    pBt = sqlite3D
20bb0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
20bc0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
20bd0 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
20be0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
20bf0 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
20c00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
20c10 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
20c20 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
20c30 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
20c40 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
20c50 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
20c60 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
20c70 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
20c80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
20c90 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
20ca0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
20cb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
20cc0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
20cd0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
20ce0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
20cf0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
20d00 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
20d10 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
20d20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74    }.#endif.  pBt
20d30 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
20d40 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
20d50 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
20d60 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
20d70 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29  eIsReadonly(pBt)
20d80 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66   : -1;.}..#ifdef
20d90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
20da0 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62  NAPSHOT./*.** Ob
20db0 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f 74 20  tain a snapshot 
20dc0 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 73  handle for the s
20dd0 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74 61 62  napshot of datab
20de0 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e 74 6c  ase zDb currentl
20df0 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  y .** being read
20e00 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a   by handle db..*
20e10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
20e20 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 73 71  apshot_get(.  sq
20e30 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f  lite3 *db, .  co
20e40 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
20e50 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
20e60 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29  t **ppSnapshot.)
20e70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20e80 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64  ITE_ERROR;.#ifnd
20e90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
20ea0 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  AL..#ifdef SQLIT
20eb0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
20ec0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
20ed0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
20ee0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
20ef0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
20f00 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
20f10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20f20 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
20f30 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  ;..  if( db->aut
20f40 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  oCommit==0 ){.  
20f50 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
20f60 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
20f70 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
20f80 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20  iDb==0 || iDb>1 
20f90 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
20fa0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  pBt = db->aDb[iD
20fb0 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  b].pBt;.      if
20fc0 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  ( 0==sqlite3Btre
20fd0 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
20fe0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20ff0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
21000 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30  nTrans(pBt, 0, 0
21010 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
21020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21030 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
21040 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
21050 68 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42 74  hotGet(sqlite3Bt
21060 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70  reePager(pBt), p
21070 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20  pSnapshot);.    
21080 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21090 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
210a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
210b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69  b->mutex);.#endi
210c0 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  f   /* SQLITE_OM
210d0 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75  IT_WAL */.  retu
210e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
210f0 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  Open a read-tran
21100 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
21110 6e 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69  napshot idendifi
21120 65 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e  ed by pSnapshot.
21130 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
21140 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20  snapshot_open(. 
21150 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
21160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
21170 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61  , .  sqlite3_sna
21180 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74  pshot *pSnapshot
21190 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
211a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66  QLITE_ERROR;.#if
211b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
211c0 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c  _WAL..#ifdef SQL
211d0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
211e0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
211f0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
21200 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
21210 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
21220 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
21230 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
21240 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
21250 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75  x);.  if( db->au
21260 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20  toCommit==0 ){. 
21270 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
21280 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
21290 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
212a0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30  ;.    if( iDb==0
212b0 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   || iDb>1 ){.   
212c0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
212d0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
212e0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
212f0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
21300 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b  eadTrans(pBt) ){
21310 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
21320 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
21330 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74  otOpen(sqlite3Bt
21340 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70  reePager(pBt), p
21350 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20  Snapshot);.     
21360 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
21390 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
213a0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
213b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
213c0 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c  SnapshotOpen(sql
213d0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
213e0 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Bt), 0);.       
213f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21400 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
21410 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
21420 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20  mutex);.#endif  
21430 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
21440 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  WAL */.  return 
21450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  rc;.}../*.** Rec
21460 6f 76 65 72 20 61 73 20 6d 61 6e 79 20 73 6e 61  over as many sna
21470 70 73 68 6f 74 73 20 61 73 20 70 6f 73 73 69 62  pshots as possib
21480 6c 65 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20  le from the wal 
21490 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
214a0 77 69 74 68 0a 2a 2a 20 73 63 68 65 6d 61 20 7a  with.** schema z
214b0 44 62 20 6f 66 20 64 61 74 61 62 61 73 65 20 64  Db of database d
214c0 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
214d0 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76  3_snapshot_recov
214e0 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  er(sqlite3 *db, 
214f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
21500 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21510 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74  ITE_ERROR;.  int
21520 20 69 44 62 3b 0a 23 69 66 6e 64 65 66 20 53 51   iDb;.#ifndef SQ
21530 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23  LITE_OMIT_WAL..#
21540 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
21550 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
21560 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
21570 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
21580 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21590 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
215a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
215b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
215c0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
215d0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
215e0 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
215f0 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c  ;.  if( iDb==0 |
21600 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 42  | iDb>1 ){.    B
21610 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
21620 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
21630 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
21640 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61  BtreeIsInReadTra
21650 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
21660 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21670 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74  eeBeginTrans(pBt
21680 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
21690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
216a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
216b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61   sqlite3PagerSna
216c0 70 73 68 6f 74 52 65 63 6f 76 65 72 28 73 71 6c  pshotRecover(sql
216d0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
216e0 42 74 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Bt));.        sq
216f0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21700 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pBt);.      }. 
21710 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
21720 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
21730 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69  b->mutex);.#endi
21740 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  f   /* SQLITE_OM
21750 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75  IT_WAL */.  retu
21760 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21770 46 72 65 65 20 61 20 73 6e 61 70 73 68 6f 74 20  Free a snapshot 
21780 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64 20  handle obtained 
21790 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e 61  from sqlite3_sna
217a0 70 73 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f 0a  pshot_get()..*/.
217b0 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 6e 61  void sqlite3_sna
217c0 70 73 68 6f 74 5f 66 72 65 65 28 73 71 6c 69 74  pshot_free(sqlit
217d0 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e  e3_snapshot *pSn
217e0 61 70 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69 74  apshot){.  sqlit
217f0 65 33 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f  e3_free(pSnapsho
21800 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
21810 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
21820 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 6e 64  APSHOT */..#ifnd
21830 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
21840 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41  OMPILEOPTION_DIA
21850 47 53 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  GS./*.** Given t
21860 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6d  he name of a com
21870 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
21880 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  , return true if
21890 20 74 68 61 74 20 6f 70 74 69 6f 6e 0a 2a 2a 20   that option.** 
218a0 77 61 73 20 75 73 65 64 20 61 6e 64 20 66 61 6c  was used and fal
218b0 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  se if not..**.**
218c0 20 54 68 65 20 6e 61 6d 65 20 63 61 6e 20 6f 70   The name can op
218d0 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69 6e 20 77  tionally begin w
218e0 69 74 68 20 22 53 51 4c 49 54 45 5f 22 20 62 75  ith "SQLITE_" bu
218f0 74 20 74 68 65 20 22 53 51 4c 49 54 45 5f 22 20  t the "SQLITE_" 
21900 70 72 65 66 69 78 0a 2a 2a 20 69 73 20 6e 6f 74  prefix.** is not
21910 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
21920 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71  match..*/.int sq
21930 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
21940 69 6f 6e 5f 75 73 65 64 28 63 6f 6e 73 74 20 63  ion_used(const c
21950 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 29 7b 0a  har *zOptName){.
21960 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e    int i, n;.  in
21970 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20  t nOpt;.  const 
21980 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65  char **azCompile
21990 4f 70 74 3b 0a 20 0a 23 69 66 20 53 51 4c 49 54  Opt;. .#if SQLIT
219a0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
219b0 4f 52 0a 20 20 69 66 28 20 7a 4f 70 74 4e 61 6d  OR.  if( zOptNam
219c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 28 76 6f 69  e==0 ){.    (voi
219d0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
219e0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
219f0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   0;.  }.#endif..
21a00 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 20 3d    azCompileOpt =
21a10 20 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c 65 4f   sqlite3CompileO
21a20 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a 0a  ptions(&nOpt);..
21a30 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
21a40 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20  NICmp(zOptName, 
21a50 22 53 51 4c 49 54 45 5f 22 2c 20 37 29 3d 3d 30  "SQLITE_", 7)==0
21a60 20 29 20 7a 4f 70 74 4e 61 6d 65 20 2b 3d 20 37   ) zOptName += 7
21a70 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  ;.  n = sqlite3S
21a80 74 72 6c 65 6e 33 30 28 7a 4f 70 74 4e 61 6d 65  trlen30(zOptName
21a90 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 6e  );..  /* Since n
21aa0 4f 70 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  Opt is normally 
21ab0 69 6e 20 73 69 6e 67 6c 65 20 64 69 67 69 74 73  in single digits
21ac0 2c 20 61 20 6c 69 6e 65 61 72 20 73 65 61 72 63  , a linear searc
21ad0 68 20 69 73 20 0a 20 20 2a 2a 20 61 64 65 71 75  h is .  ** adequ
21ae0 61 74 65 2e 20 4e 6f 20 6e 65 65 64 20 66 6f 72  ate. No need for
21af0 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68   a binary search
21b00 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
21b10 69 3c 6e 4f 70 74 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOpt; i++){.  
21b20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
21b30 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20  NICmp(zOptName, 
21b40 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 2c  azCompileOpt[i],
21b50 20 6e 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73   n)==0.     && s
21b60 71 6c 69 74 65 33 49 73 49 64 43 68 61 72 28 28  qlite3IsIdChar((
21b70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 61 7a  unsigned char)az
21b80 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 5b 6e 5d  CompileOpt[i][n]
21b90 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
21ba0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21bb0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
21bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21bd0 6e 20 74 68 65 20 4e 2d 74 68 20 63 6f 6d 70 69  n the N-th compi
21be0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 73  le-time option s
21bf0 74 72 69 6e 67 2e 20 20 49 66 20 4e 20 69 73 20  tring.  If N is 
21c00 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 0a 2a 2a  out of range,.**
21c10 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20 70   return a NULL p
21c20 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74  ointer..*/.const
21c30 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 63   char *sqlite3_c
21c40 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74  ompileoption_get
21c50 28 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6e  (int N){.  int n
21c60 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Opt;.  const cha
21c70 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  r **azCompileOpt
21c80 3b 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  ;.  azCompileOpt
21c90 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c   = sqlite3Compil
21ca0 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b  eOptions(&nOpt);
21cb0 0a 20 20 69 66 28 20 4e 3e 3d 30 20 26 26 20 4e  .  if( N>=0 && N
21cc0 3c 6e 4f 70 74 20 29 7b 0a 20 20 20 20 72 65 74  <nOpt ){.    ret
21cd0 75 72 6e 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  urn azCompileOpt
21ce0 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [N];.  }.  retur
21cf0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
21d00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
21d10 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53  PILEOPTION_DIAGS
21d20 20 2a 2f 0a                                       */.