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

Artifact cfc789be51029ac70b040a78e0d49919f85e698aded32ebb80f6c0c11637fb4b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  ES */..#ifdef SQ
5de0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
5df0: 52 49 41 4c 49 5a 45 0a 20 20 20 20 63 61 73 65  RIALIZE.    case
5e00: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5e10: 45 4d 44 42 5f 4d 41 58 53 49 5a 45 3a 20 7b 0a  EMDB_MAXSIZE: {.
5e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5e30: 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 65 6d 64  balConfig.mxMemd
5e40: 62 53 69 7a 65 20 3d 20 76 61 5f 61 72 67 28 61  bSize = va_arg(a
5e50: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
5e60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5e70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5e80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
5e90: 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 0a 20 20  SERIALIZE */..  
5ea0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5eb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5ec0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
5ed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
5ee0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5ef0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5f00: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
5f10: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
5f20: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
5f30: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
5f40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
5f50: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
5f60: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
5f70: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
5f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
5fa0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
5fb0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5fc0: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
5fd0: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
5fe0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
5ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
6000: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
6010: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
6020: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
6030: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
6040: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
6050: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
6060: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
6070: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
6080: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
6090: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
60a0: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
60b0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
60c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
60d0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
60e0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
60f0: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
6100: 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20  t cnt){.#ifndef 
6110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b  SQLITE_OMIT_LOOK
6120: 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53  ASIDE.  void *pS
6130: 74 61 72 74 3b 0a 20 20 0a 20 20 69 66 28 20 73  tart;.  .  if( s
6140: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
6150: 73 65 64 28 64 62 2c 30 29 3e 30 20 29 7b 0a 20  sed(db,0)>0 ){. 
6160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6170: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
6180: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
6190: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
61a0: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
61b0: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
61c0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
61d0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
61e0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
61f0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
6200: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
6210: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
6220: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6230: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6240: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6250: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6260: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6270: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6280: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6290: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
62a0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
62b0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
62c0: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
62d0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
62e0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
62f0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
6300: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
6310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6320: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6330: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6340: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6350: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6360: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6370: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6390: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
63a0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
63b0: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
63c0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
63d0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
63e0: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
63f0: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
6400: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
6410: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
6420: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
6430: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
6440: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
6450: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
6460: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
6470: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
6480: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
6490: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74  >lookaside.pInit
64a0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
64b0: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b  aside.pFree = 0;
64c0: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
64d0: 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20  .sz = (u16)sz;. 
64e0: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
64f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f     int i;.    Lo
6500: 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a  okasideSlot *p;.
6510: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e      assert( sz >
6520: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f   (int)sizeof(Loo
6530: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a  kasideSlot*) );.
6540: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6550: 65 2e 6e 53 6c 6f 74 20 3d 20 63 6e 74 3b 0a 20  e.nSlot = cnt;. 
6560: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
6570: 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20  eSlot*)pStart;. 
6580: 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20     for(i=cnt-1; 
6590: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
65a0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
65b0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69 74  >lookaside.pInit
65c0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
65d0: 61 73 69 64 65 2e 70 49 6e 69 74 20 3d 20 70 3b  aside.pInit = p;
65e0: 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  .      p = (Look
65f0: 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38  asideSlot*)&((u8
6600: 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a  *)p)[sz];.    }.
6610: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6620: 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20  e.pEnd = p;.    
6630: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
6640: 69 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  isable = 0;.    
6650: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6660: 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d  alloced = pBuf==
6670: 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b  0 ?1:0;.  }else{
6680: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6690: 64 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a  de.pStart = db;.
66a0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
66b0: 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20  e.pEnd = db;.   
66c0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
66d0: 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  Disable = 1;.   
66e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
66f0: 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20  Malloced = 0;.  
6700: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6710: 6e 53 6c 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  nSlot = 0;.  }.#
6720: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6730: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a  OMIT_LOOKASIDE *
6740: 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  /.  return SQLIT
6750: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6760: 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20  eturn the mutex 
6770: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6780: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
6790: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ction..*/.sqlite
67a0: 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33  3_mutex *sqlite3
67b0: 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65  _db_mutex(sqlite
67c0: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
67d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
67e0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
67f0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6800: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
6810: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
6820: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
6830: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
6840: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75  .  return db->mu
6850: 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  tex;.}../*.** Fr
6860: 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65  ee up as much me
6870: 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66  mory as we can f
6880: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61  rom the given da
6890: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
68a0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
68b0: 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
68c0: 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a  memory(sqlite3 *
68d0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  db){.  int i;..#
68e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
68f0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
6900: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
6910: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
6920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6930: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
6940: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
6950: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6960: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
6970: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
6980: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
6990: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
69a0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
69b0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
69c0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
69d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
69e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
69f0: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
6a00: 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
6a10: 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nk(pPager);.    
6a20: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
6a30: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
6a40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
6a50: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
6a60: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
6a70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6a80: 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79   Flush any dirty
6a90: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
6aa0: 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e  ger-cache for an
6ab0: 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  y attached datab
6ac0: 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a  ase.** to disk..
6ad0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
6ae0: 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c  b_cacheflush(sql
6af0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6b00: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
6b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
6b20: 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a  bSeenBusy = 0;..
6b30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6b40: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
6b50: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
6b60: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
6b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
6b80: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6b90: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6ba0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6bb0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6bc0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6bd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
6be0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
6bf0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6c00: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
6c10: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
6c20: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
6c30: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
6c40: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
6c50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6c60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
6c70: 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ger(pBt);.      
6c80: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6c90: 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a  rFlush(pPager);.
6ca0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6cb0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
6cc0: 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d       bSeenBusy =
6cd0: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
6ce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6cf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6d00: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
6d10: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
6d20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6d30: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6d40: 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
6d50: 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73  E_OK && bSeenBus
6d60: 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  y) ? SQLITE_BUSY
6d70: 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
6d80: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   Configuration s
6d90: 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69  ettings for an i
6da0: 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61  ndividual databa
6db0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f  se connection.*/
6dc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
6dd0: 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a  config(sqlite3 *
6de0: 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  db, int op, ...)
6df0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
6e00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
6e10: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
6e20: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
6e30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42    case SQLITE_DB
6e40: 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d  CONFIG_MAINDBNAM
6e50: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d  E: {.      /* IM
6e60: 50 3a 20 52 2d 30 36 38 32 34 2d 32 38 35 33 31  P: R-06824-28531
6e70: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50   */.      /* IMP
6e80: 3a 20 52 2d 33 36 32 35 37 2d 35 32 31 32 35 20  : R-36257-52125 
6e90: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  */.      db->aDb
6ea0: 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 76  [0].zDbSName = v
6eb0: 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b  a_arg(ap,char*);
6ec0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6ed0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65  TE_OK;.      bre
6ee0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6ef0: 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  se SQLITE_DBCONF
6f00: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
6f10: 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66        void *pBuf
6f20: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
6f30: 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  id*); /* IMP: R-
6f40: 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20  26835-10964 */. 
6f50: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61       int sz = va
6f60: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
6f70: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
6f80: 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20  7871-25994 */.  
6f90: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61      int cnt = va
6fa0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20  _arg(ap, int);  
6fb0: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34      /* IMP: R-04
6fc0: 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20  460-53386 */.   
6fd0: 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f     rc = setupLoo
6fe0: 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c  kaside(db, pBuf,
6ff0: 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20   sz, cnt);.     
7000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7010: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7020: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7030: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20  struct {.       
7040: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a   int op;      /*
7050: 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   The opcode */. 
7060: 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b         u32 mask;
7070: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
7080: 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65  he bit in sqlite
7090: 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63  3.flags to set/c
70a0: 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20  lear */.      } 
70b0: 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20  aFlagOp[] = {.  
70c0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
70d0: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
70e0: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 53  KEY,           S
70f0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
7100: 73 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  s    },.        
7110: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
7120: 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
7130: 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
7140: 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d  EnableTrigger  }
7150: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
7160: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
7170: 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45  LE_FTS3_TOKENIZE
7180: 52 2c 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f  R, SQLITE_Fts3To
7190: 6b 65 6e 69 7a 65 72 20 20 7d 2c 0a 20 20 20 20  kenizer  },.    
71a0: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
71b0: 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41  ONFIG_ENABLE_LOA
71c0: 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 20 53 51 4c  D_EXTENSION, SQL
71d0: 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  ITE_LoadExtensio
71e0: 6e 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  n  },.        { 
71f0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
7200: 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45  NO_CKPT_ON_CLOSE
7210: 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 6f  ,      SQLITE_No
7220: 43 6b 70 74 4f 6e 43 6c 6f 73 65 20 20 7d 2c 0a  CkptOnClose  },.
7230: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
7240: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
7250: 5f 51 50 53 47 2c 20 20 20 20 20 20 20 20 20 20  _QPSG,          
7260: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
7270: 53 47 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  SG     },.      
7280: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
7290: 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
72a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
72b0: 45 5f 54 72 69 67 67 65 72 45 51 50 20 20 20 20  E_TriggerEQP    
72c0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
72d0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45  LITE_DBCONFIG_RE
72e0: 53 45 54 5f 44 41 54 41 42 41 53 45 2c 20 20 20  SET_DATABASE,   
72f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 52 65 73 65       SQLITE_Rese
7300: 74 44 61 74 61 62 61 73 65 20 20 7d 2c 0a 20 20  tDatabase  },.  
7310: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
7320: 42 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56  BCONFIG_DEFENSIV
7330: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53  E,             S
7340: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20  QLITE_Defensive 
7350: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b       },.      };
7360: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
7370: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20  int i;.      rc 
7380: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
7390: 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d  /* IMP: R-42790-
73a0: 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66  23372 */.      f
73b0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
73c0: 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b  ize(aFlagOp); i+
73d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
73e0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f  aFlagOp[i].op==o
73f0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
7400: 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72  nt onoff = va_ar
7410: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
7420: 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20        int *pRes 
7430: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
7440: 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 36  *);.          u6
7450: 34 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d  4 oldFlags = db-
7460: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
7470: 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b    if( onoff>0 ){
7480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
7490: 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f  >flags |= aFlagO
74a0: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
74b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
74c0: 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  noff==0 ){.     
74d0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
74e0: 20 26 3d 20 7e 28 75 36 34 29 61 46 6c 61 67 4f   &= ~(u64)aFlagO
74f0: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
7500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7510: 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64   if( oldFlags!=d
7520: 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  b->flags ){.    
7530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7540: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
7550: 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a  tements(db, 0);.
7560: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7570: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
7580: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
7590: 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  Res = (db->flags
75a0: 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61   & aFlagOp[i].ma
75b0: 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  sk)!=0;.        
75c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
75d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
75e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
75f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7600: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7610: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
7620: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
7630: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
7640: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
7650: 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d  buffer z[0..n-1]
7660: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70   contains all sp
7670: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
7680: 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f  int allSpaces(co
7690: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
76a0: 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e   n){.  while( n>
76b0: 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27  0 && z[n-1]==' '
76c0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74   ){ n--; }.  ret
76d0: 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn n==0;.}../*.
76e0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
76f0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
7700: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
7710: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
7720: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
7730: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
7740: 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75  the padFlag argu
7750: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
7760: 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64   then space padd
7770: 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  ing at the end.*
7780: 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20  * of strings is 
7790: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
77a0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54  mplements the RT
77b0: 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  RIM collation..*
77c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e  /.static int bin
77d0: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
77e0: 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74   *padFlag,.  int
77f0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
7800: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
7810: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
7820: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
7830: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
7840: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
7850: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f  ey1 : nKey2;.  /
7860: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
7870: 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68 65  -65033-28449 The
7880: 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59   built-in BINARY
7890: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61   collation compa
78a0: 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73  res.  ** strings
78b0: 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75 73   byte by byte us
78c0: 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29  ing the memcmp()
78d0: 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74   function from t
78e0: 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20  he standard C.  
78f0: 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20  ** library. */. 
7900: 20 61 73 73 65 72 74 28 20 70 4b 65 79 31 20 26   assert( pKey1 &
7910: 26 20 70 4b 65 79 32 20 29 3b 0a 20 20 72 63 20  & pKey2 );.  rc 
7920: 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20  = memcmp(pKey1, 
7930: 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28  pKey2, n);.  if(
7940: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
7950: 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26  ( padFlag.     &
7960: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
7970: 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b  ar*)pKey1)+n, nK
7980: 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61  ey1-n).     && a
7990: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
79a0: 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32  )pKey2)+n, nKey2
79b0: 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  -n).    ){.     
79c0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
79d0: 20 52 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52   R-31624-24737 R
79e0: 54 52 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e  TRIM is like BIN
79f0: 41 52 59 20 65 78 63 65 70 74 20 74 68 61 74 20  ARY except that 
7a00: 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73  extra.      ** s
7a10: 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64  paces at the end
7a20: 20 6f 66 20 65 69 74 68 65 72 20 73 74 72 69 6e   of either strin
7a30: 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  g do not change 
7a40: 74 68 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f  the result. In o
7a50: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f  ther.      ** wo
7a60: 72 64 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c  rds, strings wil
7a70: 6c 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  l compare equal 
7a80: 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61  to one another a
7a90: 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20  s long as they. 
7aa0: 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f       ** differ o
7ab0: 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65  nly in the numbe
7ac0: 72 20 6f 66 20 73 70 61 63 65 73 20 61 74 20 74  r of spaces at t
7ad0: 68 65 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f  he end..      */
7ae0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7af0: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
7b00: 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key2;.    }.  }.
7b10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7b20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
7b30: 65 20 69 66 20 43 6f 6c 6c 53 65 71 20 69 73 20  e if CollSeq is 
7b40: 74 68 65 20 64 65 66 61 75 6c 74 20 62 75 69 6c  the default buil
7b50: 74 2d 69 6e 20 42 49 4e 41 52 59 2e 0a 2a 2f 0a  t-in BINARY..*/.
7b60: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 42 69 6e  int sqlite3IsBin
7b70: 61 72 79 28 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  ary(const CollSe
7b80: 71 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  q *p){.  assert(
7b90: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 78 43 6d 70   p==0 || p->xCmp
7ba0: 21 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 7c 7c  !=binCollFunc ||
7bb0: 20 70 2d 3e 70 55 73 65 72 21 3d 30 0a 20 20 20   p->pUser!=0.   
7bc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
7bd0: 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 22 42 49 4e  mp(p->zName,"BIN
7be0: 41 52 59 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65  ARY")==0 );.  re
7bf0: 74 75 72 6e 20 70 3d 3d 30 20 7c 7c 20 28 70 2d  turn p==0 || (p-
7c00: 3e 78 43 6d 70 3d 3d 62 69 6e 43 6f 6c 6c 46 75  >xCmp==binCollFu
7c10: 6e 63 20 26 26 20 70 2d 3e 70 55 73 65 72 3d 3d  nc && p->pUser==
7c20: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  0);.}../*.** Ano
7c30: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
7c40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7c50: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
7c60: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
7c70: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
7c80: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
7c90: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
7ca0: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
7cb0: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
7cc0: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
7cd0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
7ce0: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
7cf0: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
7d00: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
7d10: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
7d20: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
7d30: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
7d40: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
7d50: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
7d60: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
7d70: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
7d80: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
7d90: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
7da0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7db0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7dc0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7dd0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7de0: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
7df0: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
7e00: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7e10: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
7e20: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
7e30: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
7e40: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
7e50: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
7e60: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
7e70: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
7e80: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
7e90: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
7ea0: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
7eb0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
7ec0: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
7ed0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
7ee0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7ef0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
7f00: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7f10: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7f20: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7f30: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7f40: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7f50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7f60: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
7f70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
7f80: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
7f90: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  id;.}../*.** Set
7fa0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
7fb0: 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ned by the sqlit
7fc0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7fd0: 6f 77 69 64 28 29 20 41 50 49 20 66 75 6e 63 74  owid() API funct
7fe0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7ff0: 69 74 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e  ite3_set_last_in
8000: 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74  sert_rowid(sqlit
8010: 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f  e3 *db, sqlite3_
8020: 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23  int64 iRowid){.#
8030: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8040: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
8050: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
8060: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
8070: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
8080: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
8090: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
80a0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
80b0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
80c0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61  mutex);.  db->la
80d0: 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
80e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
80f0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8100: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  x);.}../*.** Ret
8110: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8120: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
8130: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
8140: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
8150: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
8160: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
8170: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
8180: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
8190: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
81a0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
81b0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
81c0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
81d0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
81e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
81f0: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
8200: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
8210: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8220: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
8230: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
8240: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
8250: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
8260: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
8270: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
8280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8290: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
82a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
82b0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
82c0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
82d0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
82e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
82f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
8300: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
8310: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
8320: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
8330: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
8340: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
8350: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
8360: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
8370: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
8380: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
8390: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
83a0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
83b0: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
83c0: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
83d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
83e0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
83f0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
8400: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
8410: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
8420: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
8430: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
8440: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
8450: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
8460: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8470: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
8480: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
8490: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
84a0: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
84b0: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
84c0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
84d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
84e0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
84f0: 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  nction associate
8500: 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70  d with FuncDef p
8510: 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74  , if any. Except
8520: 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  ,.** if this is 
8530: 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70  not the last cop
8540: 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  y of the functio
8550: 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  n, do not invoke
8560: 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a   it. Multiple.**
8570: 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e   copies of a sin
8580: 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  gle function are
8590: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72   created when cr
85a0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  eate_function() 
85b0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74  is called.** wit
85c0: 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20  h SQLITE_ANY as 
85d0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  the encoding..*/
85e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e  .static void fun
85f0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c  ctionDestroy(sql
8600: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
8610: 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73  f *p){.  FuncDes
8620: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
8630: 63 74 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73  ctor = p->u.pDes
8640: 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70  tructor;.  if( p
8650: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
8660: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
8670: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8680: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
8690: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65  ==0 ){.      pDe
86a0: 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72  structor->xDestr
86b0: 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  oy(pDestructor->
86c0: 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20  pUserData);.    
86d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
86e0: 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  db, pDestructor)
86f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8700: 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20  *.** Disconnect 
8710: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  all sqlite3_vtab
8720: 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65   objects that be
8730: 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  long to database
8740: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64   connection.** d
8750: 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  b. This is calle
8760: 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69  d when db is bei
8770: 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ng closed..*/.st
8780: 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e  atic void discon
8790: 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69  nectAllVtab(sqli
87a0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65  te3 *db){.#ifnde
87b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
87c0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74  RTUALTABLE.  int
87d0: 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   i;.  HashElem *
87e0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
87f0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
8800: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
8810: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53  nDb; i++){.    S
8820: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
8830: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
8840: 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 70 53 63  ema;.    if( pSc
8850: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f  hema ){.      fo
8860: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
8870: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
8880: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
8890: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
88a0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
88b0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
88c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
88d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
88e0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
88f0: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
8900: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
8910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8920: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8930: 41 42 4c 45 5f 53 48 41 52 45 44 5f 53 43 48 45  ABLE_SHARED_SCHE
8940: 4d 41 0a 20 20 20 20 69 66 28 20 49 73 53 68 61  MA.    if( IsSha
8950: 72 65 64 53 63 68 65 6d 61 28 64 62 29 20 26 26  redSchema(db) &&
8960: 20 69 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 56   i!=1 ){.      V
8970: 54 61 62 6c 65 20 2a 70 56 54 61 62 6c 65 3b 0a  Table *pVTable;.
8980: 20 20 20 20 20 20 56 54 61 62 6c 65 20 2a 70 4e        VTable *pN
8990: 65 78 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ext;.      for(p
89a0: 56 54 61 62 6c 65 3d 64 62 2d 3e 61 44 62 5b 69  VTable=db->aDb[i
89b0: 5d 2e 70 56 54 61 62 6c 65 3b 20 70 56 54 61 62  ].pVTable; pVTab
89c0: 6c 65 3b 20 70 56 54 61 62 6c 65 3d 70 4e 65 78  le; pVTable=pNex
89d0: 74 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 78  t){.        pNex
89e0: 74 20 3d 20 70 56 54 61 62 6c 65 2d 3e 70 4e 65  t = pVTable->pNe
89f0: 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
8a00: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 70 56  te3VtabUnlock(pV
8a10: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
8a20: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d        db->aDb[i]
8a30: 2e 70 56 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  .pVTable = 0;.  
8a40: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
8a50: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8a60: 45 5f 53 48 41 52 45 44 5f 53 43 48 45 4d 41 20  E_SHARED_SCHEMA 
8a70: 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73  */.  }.  for(p=s
8a80: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
8a90: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b  db->aModule); p;
8aa0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
8ab0: 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(p)){.    Modul
8ac0: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
8ad0: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
8ae0: 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(p);.    if( p
8af0: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a  Mod->pEpoTab ){.
8b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
8b10: 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  bDisconnect(db, 
8b20: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a  pMod->pEpoTab);.
8b30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
8b40: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
8b50: 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  t(db);.  sqlite3
8b60: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
8b70: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
8b80: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
8b90: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
8ba0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
8bb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8bc0: 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e  ion db has unfin
8bd0: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
8be0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
8bf0: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
8c00: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8c10: 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ts.  .*/.static 
8c20: 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73  int connectionIs
8c30: 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62  Busy(sqlite3 *db
8c40: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73  ){.  int j;.  as
8c50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8c60: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
8c70: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ex) );.  if( db-
8c80: 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20  >pVdbe ) return 
8c90: 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  1;.  for(j=0; j<
8ca0: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
8cb0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8cc0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a  db->aDb[j].pBt;.
8cd0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
8ce0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42  qlite3BtreeIsInB
8cf0: 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74  ackup(pBt) ) ret
8d00: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
8d10: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8d20: 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Close an existin
8d30: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
8d40: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
8d50: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c  sqlite3Close(sql
8d60: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f  ite3 *db, int fo
8d70: 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66  rceZombie){.  if
8d80: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20  ( !db ){.    /* 
8d90: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
8da0: 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c 69  3257-11740 Calli
8db0: 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  ng sqlite3_close
8dc0: 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  () or.    ** sql
8dd0: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20  ite3_close_v2() 
8de0: 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  with a NULL poin
8df0: 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ter argument is 
8e00: 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70  a harmless no-op
8e10: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
8e20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
8e30: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
8e40: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
8e50: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
8e60: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
8e70: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
8e80: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8e90: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
8ea0: 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 20  f( db->mTrace & 
8eb0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
8ec0: 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54  SE ){.    db->xT
8ed0: 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43  race(SQLITE_TRAC
8ee0: 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72  E_CLOSE, db->pTr
8ef0: 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a  aceArg, db, 0);.
8f00: 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20    }..  /* Force 
8f10: 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c  xDisconnect call
8f20: 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c  s on all virtual
8f30: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73   tables */.  dis
8f40: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64  connectAllVtab(d
8f50: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  b);..  /* If a t
8f60: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
8f70: 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65  en, the disconne
8f80: 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c  ctAllVtab() call
8f90: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
8fa0: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
8fb0: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
8fc0: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
8fd0: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
8fe0: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
8ff0: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
9000: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
9010: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
9020: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
9030: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
9040: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
9050: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
9060: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
9070: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
9080: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
9090: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
90a0: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
90b0: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
90c0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
90d0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
90e0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
90f0: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
9100: 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f  * Legacy behavio
9110: 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  r (sqlite3_close
9120: 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20  () behavior) is 
9130: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
9140: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68  QLITE_BUSY if th
9150: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
9160: 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69   not be closed i
9170: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
9180: 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d  .  if( !forceZom
9190: 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f  bie && connectio
91a0: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
91b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
91c0: 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
91d0: 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20  E_BUSY, "unable 
91e0: 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20  to close due to 
91f0: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20  unfinalized ".  
9200: 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73       "statements
9210: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62   or unfinished b
9220: 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71  ackups");.    sq
9230: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9240: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9250: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9260: 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  BUSY;.  }..#ifde
9270: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9280: 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
9290: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
92a0: 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
92b0: 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68  /* Closing the h
92c0: 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
92d0: 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
92e0: 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a  d the value 2. *
92f0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  /.    sqlite3Glo
9300: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
9310: 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g(sqlite3GlobalC
9320: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
9330: 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d  , db, 0, 2);.  }
9340: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
9350: 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63  nvert the connec
9360: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62  tion into a zomb
9370: 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73  ie and then clos
9380: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d  e it..  */.  db-
9390: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
93a0: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20  MAGIC_ZOMBIE;.  
93b0: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
93c0: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
93d0: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
93e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
93f0: 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73  * Two variations
9400: 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69   on the public i
9410: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f  nterface for clo
9420: 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  sing a database.
9430: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  ** connection. T
9440: 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  he sqlite3_close
9450: 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72  () version retur
9460: 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ns SQLITE_BUSY a
9470: 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65  nd.** leaves the
9480: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69   connection opti
9490: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
94a0: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70  unfinalized prep
94b0: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
94c0: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
94d0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73   sqlite3_backups
94e0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  .  The sqlite3_c
94f0: 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72  lose_v2().** ver
9500: 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20  sion forces the 
9510: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
9520: 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66  come a zombie if
9530: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e   there are.** un
9540: 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73  closed resources
9550: 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66  , and arranges f
9560: 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  or deallocation 
9570: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a  when the last.**
9580: 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
9590: 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  nt or sqlite3_ba
95a0: 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a  ckup closes..*/.
95b0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
95c0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  e(sqlite3 *db){ 
95d0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
95e0: 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74  ose(db,0); }.int
95f0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
9600: 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  2(sqlite3 *db){ 
9610: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
9620: 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f  ose(db,1); }.../
9630: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d  *.** Close the m
9640: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
9650: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
9660: 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  **.** Furthermor
9670: 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63  e, if database c
9680: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
9690: 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e  a zombie (meanin
96a0: 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  g that there.** 
96b0: 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72  has been a prior
96c0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
96d0: 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71  _close(db) or sq
96e0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64  lite3_close_v2(d
96f0: 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79  b)) and.** every
9700: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61   sqlite3_stmt ha
9710: 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c  s now been final
9720: 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73  ized and every s
9730: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61  qlite3_backup ha
9740: 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74  s.** finished, t
9750: 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73  hen free all res
9760: 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ources..*/.void 
9770: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
9780: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
9790: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
97a0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20  HashElem *i;    
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74  /* Hash table it
97d0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
97e0: 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  j;..  /* If ther
97f0: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
9800: 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  g sqlite3_stmt o
9810: 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  r sqlite3_backup
9820: 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72   objects.  ** or
9830: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
9840: 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  on has not yet b
9850: 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71  een closed by sq
9860: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
9870: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74  ,.  ** then just
9880: 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78   leave the mutex
9890: 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
98a0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  /.  if( db->magi
98b0: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
98c0: 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63  ZOMBIE || connec
98d0: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
98e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
98f0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9900: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
9910: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
9920: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
9930: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
9940: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
9950: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20  onnection has.  
9960: 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71  ** closed all sq
9970: 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73  lite3_stmt and s
9980: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
9990: 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65  jects and has be
99a0: 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74  en.  ** passed t
99b0: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20  o sqlite3_close 
99c0: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74  (meaning that it
99d0: 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20   is a zombie).  
99e0: 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20  Therefore,.  ** 
99f0: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65  go ahead and fre
9a00: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
9a10: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  .  */..  /* If a
9a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
9a30: 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61  open, roll it ba
9a40: 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e  ck. This also en
9a50: 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20  sures that if.  
9a60: 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  ** any database 
9a70: 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65  schemas have bee
9a80: 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e  n modified by an
9a90: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61   uncommitted tra
9aa0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68  nsaction.  ** th
9ab0: 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e  ey are reset. An
9ac0: 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69  d that the requi
9ad0: 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
9ae0: 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65   is held to make
9af0: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20  .  ** the pager 
9b00: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
9b10: 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f  ema reset an ato
9b20: 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a  mic operation. *
9b30: 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  /.  sqlite3Rollb
9b40: 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
9b50: 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  E_OK);..  /* Fre
9b60: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
9b70: 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  g Savepoint stru
9b80: 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c  ctures. */.  sql
9b90: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
9ba0: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43  nts(db);..  /* C
9bb0: 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73  lose all databas
9bc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
9bd0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
9be0: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
9bf0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
9c00: 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20  = &db->aDb[j];. 
9c10: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
9c20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9c30: 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e  BtreeClose(pDb->
9c40: 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  pBt);.      pDb-
9c50: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >pBt = 0;.      
9c60: 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20  if( j!=1 ){.    
9c70: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
9c80: 61 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  aDisconnect(db, 
9c90: 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  j, 0);.        p
9ca0: 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b  Db->pSchema = 0;
9cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9cc0: 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68   }.  /* Clear th
9cd0: 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65  e TEMP schema se
9ce0: 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73  parately and las
9cf0: 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61  t */.  if( db->a
9d00: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
9d10: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65  .    sqlite3Sche
9d20: 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b  maClear(db->aDb[
9d30: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  1].pSchema);.  }
9d40: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
9d50: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20  lockList(db);.. 
9d60: 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20   /* Free up the 
9d70: 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61  array of auxilia
9d80: 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  ry databases */.
9d90: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
9da0: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
9db0: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
9dc0: 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73  ->nDb<=2 );.  as
9dd0: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64  sert( db->aDb==d
9de0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a  b->aDbStatic );.
9df0: 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63  .  /* Tell the c
9e00: 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20  ode in notify.c 
9e10: 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
9e20: 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f  ion no longer ho
9e30: 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63  lds any.  ** loc
9e40: 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ks and does not 
9e50: 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74  require any furt
9e60: 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  her unlock-notif
9e70: 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
9e80: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  /.  sqlite3Conne
9e90: 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b  ctionClosed(db);
9ea0: 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ..  for(i=sqlite
9eb0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9ec0: 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Func); i; i=sqli
9ed0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9ee0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65      FuncDef *pNe
9ef0: 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xt, *p;.    p = 
9f00: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9f10: 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
9f20: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
9f30: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  (db, p);.      p
9f40: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
9f50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9f60: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
9f70: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
9f80: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
9f90: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
9fa0: 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75 6e 63  Clear(&db->aFunc
9fb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  );.  for(i=sqlit
9fc0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9fd0: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
9fe0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9ff0: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
a000: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
a010: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
a020: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
a030: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
a040: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
a050: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
a060: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
a070: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
a080: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
a090: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
a0a0: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
a0b0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
a0c0: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
a0d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a0e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a0f0: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
a100: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
a110: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
a120: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
a130: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a140: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
a150: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
a160: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
a170: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
a180: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
a190: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
a1a0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
a1b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
a1c0: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
a1d0: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
a1e0: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
a1f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a200: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
a210: 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64  leClear(db, pMod
a220: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
a230: 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a  Free(db, pMod);.
a240: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
a250: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64  hClear(&db->aMod
a260: 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ule);.#endif..  
a270: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
a280: 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20   SQLITE_OK); /* 
a290: 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20  Deallocates any 
a2a0: 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74 72  cached error str
a2b0: 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ings. */.  sqlit
a2c0: 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e  e3ValueFree(db->
a2d0: 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pErr);.  sqlite3
a2e0: 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28  CloseExtensions(
a2f0: 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  db);.#if SQLITE_
a300: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
a310: 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ION.  sqlite3_fr
a320: 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74  ee(db->auth.zAut
a330: 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  hUser);.  sqlite
a340: 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e  3_free(db->auth.
a350: 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64 69 66  zAuthPW);.#endif
a360: 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
a370: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
a380: 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65  OR;..  /* The te
a390: 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68 65  mp-database sche
a3a0: 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ma is allocated 
a3b0: 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
a3c0: 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d   the other schem
a3d0: 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28  a.  ** objects (
a3e0: 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c  using sqliteMall
a3f0: 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69  oc() directly, i
a400: 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65  nstead of sqlite
a410: 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e  3BtreeSchema()).
a420: 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64  .  ** So it need
a430: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68 65  s to be freed he
a440: 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f  re. Todo: Why no
a450: 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20  t roll the temp 
a460: 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a  schema into.  **
a470: 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65   the same sqlite
a480: 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20  Malloc() as the 
a490: 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74  one that allocat
a4a0: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
a4b0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f  .  ** structure?
a4c0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
a4d0: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
a4e0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
a4f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a500: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
a510: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
a520: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53  QLITE_MAGIC_CLOS
a530: 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ED;.  sqlite3_mu
a540: 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74  tex_free(db->mut
a550: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
a560: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
a570: 73 65 64 28 64 62 2c 30 29 3d 3d 30 20 29 3b 0a  sed(db,0)==0 );.
a580: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
a590: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b  ide.bMalloced ){
a5a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a5b0: 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  e(db->lookaside.
a5c0: 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73  pStart);.  }.  s
a5d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
a5e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
a5f0: 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  ck all database 
a600: 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43  files.  If tripC
a610: 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
a620: 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  E_OK, then.** an
a630: 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
a640: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
a650: 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73 20  ("tripped" - as 
a660: 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20 63  in "tripping a c
a670: 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65  ircuit.** breake
a680: 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20  r") and made to 
a690: 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20  return tripCode 
a6a0: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
a6b0: 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65   further.** atte
a6c0: 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61 74  mpts to use that
a6d0: 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63   cursor.  Read c
a6e0: 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70  ursors remain op
a6f0: 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20  en and valid.** 
a700: 62 75 74 20 61 72 65 20 22 73 61 76 65 64 22 20  but are "saved" 
a710: 69 6e 20 63 61 73 65 20 74 68 65 20 74 61 62 6c  in case the tabl
a720: 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65  e pages are move
a730: 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69  d around..*/.voi
a740: 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
a750: 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  kAll(sqlite3 *db
a760: 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
a770: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
a780: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69  inTrans = 0;.  i
a790: 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b  nt schemaChange;
a7a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a7b0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
a7c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
a7d0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
a7e0: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20  Malloc();..  /* 
a7f0: 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65  Obtain all b-tre
a800: 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65  e mutexes before
a810: 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c   making any call
a820: 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61  s to BtreeRollba
a830: 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73  ck(). .  ** This
a840: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e   is important in
a850: 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61   case the transa
a860: 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c  ction being roll
a870: 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a  ed back has.  **
a880: 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
a890: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
a8a0: 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  f the b-tree mut
a8b0: 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b  exes are not tak
a8c0: 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68  en.  ** here, th
a8d0: 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65  en another share
a8e0: 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69  d-cache connecti
a8f0: 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  on might sneak i
a900: 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  n between.  ** t
a910: 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c  he database roll
a920: 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20  back and schema 
a930: 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e  reset, which can
a940: 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a   cause false.  *
a950: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70  * corruption rep
a960: 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73  orts in some cas
a970: 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  es.  */.  sqlite
a980: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
a990: 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e  b);.  schemaChan
a9a0: 67 65 20 3d 20 28 64 62 2d 3e 6d 44 62 46 6c 61  ge = (db->mDbFla
a9b0: 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65  gs & DBFLAG_Sche
a9c0: 6d 61 43 68 61 6e 67 65 29 21 3d 30 20 26 26 20  maChange)!=0 && 
a9d0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
a9e0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
a9f0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
aa00: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
aa10: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
aa20: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
aa30: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
aa40: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
aa50: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
aa60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
aa70: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
aa80: 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70  Rollback(p, trip
aa90: 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61  Code, !schemaCha
aaa0: 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nge);.    }.  }.
aab0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
aac0: 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c  lback(db);.  sql
aad0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
aae0: 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 73 63  loc();..  if( sc
aaf0: 68 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20  hemaChange ){.  
ab00: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
ab10: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
ab20: 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  s(db, 0);.    sq
ab30: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
ab40: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
ab50: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
ab60: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
ab70: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
ab80: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
ab90: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
aba0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
abb0: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
abc0: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
abd0: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
abe0: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
abf0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
ac00: 75 36 34 29 53 51 4c 49 54 45 5f 44 65 66 65 72  u64)SQLITE_Defer
ac10: 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  FKs;..  /* If on
ac20: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  e has been confi
ac30: 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68  gured, invoke th
ac40: 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20  e rollback-hook 
ac50: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66  callback */.  if
ac60: 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43  ( db->xRollbackC
ac70: 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72  allback && (inTr
ac80: 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f  ans || !db->auto
ac90: 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64  Commit) ){.    d
aca0: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
acb0: 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61  back(db->pRollba
acc0: 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ckArg);.  }.}../
acd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
ace0: 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74  atic string cont
acf0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
ad00: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
ad10: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
ad20: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ** specified in 
ad30: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
ad40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
ad50: 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d  ITE_NEED_ERR_NAM
ad60: 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  E).const char *s
ad70: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e  qlite3ErrName(in
ad80: 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63  t rc){.  const c
ad90: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
ada0: 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20    int i, origRc 
adb0: 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = rc;.  for(i=0;
adc0: 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30   i<2 && zName==0
add0: 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66  ; i++, rc &= 0xf
ade0: 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  f){.    switch( 
adf0: 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  rc ){.      case
ae00: 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20   SQLITE_OK:     
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
ae20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b  e = "SQLITE_OK";
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ae50: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
ae70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52  me = "SQLITE_ERR
ae80: 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OR";            
ae90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aea0: 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f  se SQLITE_ERROR_
aeb0: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 7a 4e  SNAPSHOT:     zN
aec0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52  ame = "SQLITE_ER
aed0: 52 4f 52 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  ROR_SNAPSHOT";  
aee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aef0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
af00: 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  NAL:           z
af10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
af20: 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20  NTERNAL";       
af30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
af40: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d  case SQLITE_PERM
af50: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
af60: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
af70: 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20  PERM";          
af80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
af90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
afa0: 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RT:             
afb0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
afc0: 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20  _ABORT";        
afd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
afe0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
aff0: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20  ORT_ROLLBACK:   
b000: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b010: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
b020: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
b030: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
b040: 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  USY:            
b050: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b060: 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20  TE_BUSY";       
b070: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b080: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b090: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20  BUSY_RECOVERY:  
b0a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b0b0: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
b0c0: 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  Y";     break;. 
b0d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b0e0: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20  _BUSY_SNAPSHOT: 
b0f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b100: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
b110: 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OT";     break;.
b120: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b130: 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20  E_LOCKED:       
b140: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b150: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20  QLITE_LOCKED";  
b160: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b170: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b180: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
b190: 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22  CACHE: zName = "
b1a0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
b1b0: 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b  AREDCACHE";break
b1c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b1d0: 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ITE_NOMEM:      
b1e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b1f0: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20  "SQLITE_NOMEM"; 
b200: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b210: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b220: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20  LITE_READONLY:  
b230: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b240: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
b250: 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  Y";          bre
b260: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b270: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
b280: 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20  ECOVERY:  zName 
b290: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
b2a0: 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72  LY_RECOVERY"; br
b2b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b2c0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b2d0: 43 41 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65  CANTINIT:  zName
b2e0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
b2f0: 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62  NLY_CANTINIT"; b
b300: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b310: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
b320: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d  _ROLLBACK:  zNam
b330: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b340: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  ONLY_ROLLBACK"; 
b350: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b360: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
b370: 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61  Y_DBMOVED:   zNa
b380: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
b390: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20  DONLY_DBMOVED"; 
b3a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b3b0: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
b3c0: 4c 59 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e  LY_DIRECTORY: zN
b3d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
b3e0: 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59  ADONLY_DIRECTORY
b3f0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
b400: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
b410: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a  RUPT:          z
b420: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b430: 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20  NTERRUPT";      
b440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b450: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b460: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
b470: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b480: 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20  IOERR";         
b490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b4a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b4b0: 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20  RR_READ:        
b4c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b4d0: 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20  _IOERR_READ";   
b4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b4f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b500: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
b510: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b520: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
b530: 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AD";  break;.   
b540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b550: 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20  OERR_WRITE:     
b560: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b570: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
b580: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b590: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b5a0: 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20  IOERR_FSYNC:    
b5b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b5c0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22  ITE_IOERR_FSYNC"
b5d0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b5e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b5f0: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
b600: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
b610: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
b620: 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SYNC";   break;.
b630: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b640: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
b650: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
b660: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
b670: 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b  CATE";    break;
b680: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b690: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20  TE_IOERR_FSTAT: 
b6a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b6b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
b6c0: 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  AT";       break
b6d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b6e0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
b6f0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b700: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  "SQLITE_IOERR_UN
b710: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
b720: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b730: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
b740: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
b750: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
b760: 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  DLOCK";      bre
b770: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b780: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b790: 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  TE:       zName 
b7a0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b7b0: 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72  DELETE";      br
b7c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b7d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
b7e0: 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  EM:        zName
b7f0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b800: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62  _NOMEM";       b
b810: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b820: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
b830: 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d  CESS:       zNam
b840: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b850: 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20  R_ACCESS";      
b860: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b870: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
b880: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
b890: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b8c0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b8d0: 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61  ERVEDLOCK"; brea
b8e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b8f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a  LITE_IOERR_LOCK:
b900: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b910: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c   "SQLITE_IOERR_L
b920: 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  OCK";        bre
b930: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b940: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
b950: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
b960: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b970: 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72  CLOSE";       br
b980: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b990: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b9a0: 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65  _CLOSE:    zName
b9b0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b9c0: 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62  _DIR_CLOSE";   b
b9d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b9e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b9f0: 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d  MOPEN:      zNam
ba00: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ba10: 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20  R_SHMOPEN";     
ba20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ba30: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
ba40: 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61  HMSIZE:      zNa
ba50: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ba60: 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20  RR_SHMSIZE";    
ba70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ba80: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ba90: 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e  SHMLOCK:      zN
baa0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
bab0: 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20  ERR_SHMLOCK";   
bac0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bad0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
bae0: 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a  _SHMMAP:       z
baf0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
bb00: 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20  OERR_SHMMAP";   
bb10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bb20: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
bb30: 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20  R_SEEK:         
bb40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bb50: 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20  IOERR_SEEK";    
bb60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bb70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
bb80: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a  RR_DELETE_NOENT:
bb90: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bba0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
bbb0: 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ENT";break;.    
bbc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
bbd0: 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20  ERR_MMAP:       
bbe0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bbf0: 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20  E_IOERR_MMAP";  
bc00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bc10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
bc20: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
bc30: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
bc40: 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
bc50: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
bc60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bc70: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20  IOERR_CONVPATH: 
bc80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bc90: 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
bca0: 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TH";    break;. 
bcb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bcc0: 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20  _CORRUPT:       
bcd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bce0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20  LITE_CORRUPT";  
bcf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bd00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bd10: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20  E_CORRUPT_VTAB: 
bd20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bd30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
bd40: 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AB";      break;
bd50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bd60: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20  TE_NOTFOUND:    
bd70: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bd80: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22  SQLITE_NOTFOUND"
bd90: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
bda0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bdb0: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
bdc0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bdd0: 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20  "SQLITE_FULL";  
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bdf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
be00: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
be10: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
be20: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
be30: 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  N";          bre
be40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
be50: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
be60: 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20  OTEMPDIR: zName 
be70: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
be80: 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72  EN_NOTEMPDIR";br
be90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bea0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
beb0: 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65  ISDIR:     zName
bec0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
bed0: 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62  PEN_ISDIR";    b
bee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bef0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bf00: 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d  _FULLPATH:  zNam
bf10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bf20: 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20  OPEN_FULLPATH"; 
bf30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bf40: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
bf50: 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61  N_CONVPATH:  zNa
bf60: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
bf70: 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b  TOPEN_CONVPATH";
bf80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bf90: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
bfa0: 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  OL:           zN
bfb0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52  ame = "SQLITE_PR
bfc0: 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20  OTOCOL";        
bfd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bfe0: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
bff0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
c000: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
c010: 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20  MPTY";          
c020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c030: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
c040: 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  MA:             
c050: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c060: 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20  SCHEMA";        
c070: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c080: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
c090: 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  BIG:            
c0a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c0b0: 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20  _TOOBIG";       
c0c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c0d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c0e0: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
c0f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c100: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20  E_CONSTRAINT";  
c110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c120: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
c130: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
c140: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
c150: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
c160: 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  IQUE"; break;.  
c170: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c180: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
c190: 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  ER: zName = "SQL
c1a0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
c1b0: 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20  RIGGER";break;. 
c1c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c1d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
c1e0: 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  IGNKEY:.        
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c210: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
c220: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20  NT_FOREIGNKEY"; 
c230: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c240: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c250: 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a  RAINT_CHECK:   z
c260: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c270: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22  ONSTRAINT_CHECK"
c280: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
c290: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
c2a0: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
c2b0: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c2e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
c2f0: 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65  IMARYKEY";   bre
c300: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c310: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c320: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20  _NOTNULL: zName 
c330: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
c340: 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72  AINT_NOTNULL";br
c350: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c360: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c370: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20  T_COMMITHOOK:.  
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c3a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c3b0: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
c3c0: 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OOK";   break;. 
c3d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c3e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
c3f0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
c400: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c410: 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a  VTAB";   break;.
c420: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c430: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
c440: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20  CTION:.         
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c470: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c480: 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20  T_FUNCTION";    
c490: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c4a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c4b0: 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e  AINT_ROWID:   zN
c4c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c4d0: 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b  NSTRAINT_ROWID";
c4e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c4f0: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  ase SQLITE_MISMA
c500: 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a  TCH:           z
c510: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
c520: 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20  ISMATCH";       
c530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c540: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55  case SQLITE_MISU
c550: 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SE:             
c560: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c570: 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20  MISUSE";        
c580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c590: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c   case SQLITE_NOL
c5a0: 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  FS:             
c5b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c5c0: 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20  _NOLFS";        
c5d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c5e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55    case SQLITE_AU
c5f0: 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TH:             
c600: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c610: 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20  E_AUTH";        
c620: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c630: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
c640: 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20  ORMAT:          
c650: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c660: 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20  TE_FORMAT";     
c670: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c680: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c690: 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20  RANGE:          
c6a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c6b0: 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20  ITE_RANGE";     
c6c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c6d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c6e0: 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20  _NOTADB:        
c6f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c700: 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20  LITE_NOTADB";   
c710: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c720: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c730: 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20  E_ROW:          
c740: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c750: 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20  QLITE_ROW";     
c760: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c770: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c780: 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20  TE_NOTICE:      
c790: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c7a0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20  SQLITE_NOTICE"; 
c7b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c7c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c7d0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
c7e0: 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20  ER_WAL: zName = 
c7f0: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
c800: 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61  ECOVER_WAL";brea
c810: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c820: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c830: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20  VER_ROLLBACK:.  
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c860: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c870: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
c880: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
c890: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c8a0: 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20  _WARNING:       
c8b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c8c0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20  LITE_WARNING";  
c8d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c8e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c8f0: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
c900: 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  DEX:  zName = "S
c910: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55  QLITE_WARNING_AU
c920: 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  TOINDEX"; break;
c930: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c940: 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20  TE_DONE:        
c950: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c960: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20  SQLITE_DONE";   
c970: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c980: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c990: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
c9a0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42    static char zB
c9b0: 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69  uf[50];.    sqli
c9c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
c9d0: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
c9e0: 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e   "SQLITE_UNKNOWN
c9f0: 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a  (%d)", origRc);.
ca00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66      zName = zBuf
ca10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
ca20: 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
ca30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
ca40: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
ca50: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
ca60: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
ca70: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
ca80: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
ca90: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
caa0: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
cab0: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
cac0: 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73   char* const aMs
cad0: 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53  g[] = {.    /* S
cae0: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
caf0: 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72    */ "not an err
cb00: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
cb10: 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a  TE_ERROR       *
cb20: 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72  / "SQL logic err
cb30: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
cb40: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
cb50: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
cb60: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
cb70: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
cb80: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
cb90: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
cba0: 54 20 20 20 20 20 20 20 2a 2f 20 22 71 75 65 72  T       */ "quer
cbb0: 79 20 61 62 6f 72 74 65 64 22 2c 0a 20 20 20 20  y aborted",.    
cbc0: 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20  /* SQLITE_BUSY  
cbd0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
cbe0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  se is locked",. 
cbf0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43     /* SQLITE_LOC
cc00: 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74  KED      */ "dat
cc10: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
cc20: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
cc30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20  QLITE_NOMEM     
cc40: 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d    */ "out of mem
cc50: 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ory",.    /* SQL
cc60: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  ITE_READONLY    
cc70: 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  */ "attempt to w
cc80: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
cc90: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
cca0: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  * SQLITE_INTERRU
ccb0: 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75  PT   */ "interru
ccc0: 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  pted",.    /* SQ
ccd0: 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20  LITE_IOERR      
cce0: 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72   */ "disk I/O er
ccf0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
cd00: 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20  ITE_CORRUPT     
cd10: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73  */ "database dis
cd20: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
cd30: 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rmed",.    /* SQ
cd40: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  LITE_NOTFOUND   
cd50: 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65   */ "unknown ope
cd60: 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20  ration",.    /* 
cd70: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20  SQLITE_FULL     
cd80: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
cd90: 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22  or disk is full"
cda0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
cdb0: 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22  CANTOPEN    */ "
cdc0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
cdd0: 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20  atabase file",. 
cde0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f     /* SQLITE_PRO
cdf0: 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63  TOCOL    */ "loc
ce00: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a  king protocol",.
ce10: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d      /* SQLITE_EM
ce20: 50 54 59 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  PTY       */ 0,.
ce30: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43      /* SQLITE_SC
ce40: 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61  HEMA      */ "da
ce50: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
ce60: 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20  s changed",.    
ce70: 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  /* SQLITE_TOOBIG
ce80: 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67        */ "string
ce90: 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67   or blob too big
cea0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
ceb0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20  _CONSTRAINT  */ 
cec0: 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  "constraint fail
ced0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cee0: 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a  TE_MISMATCH    *
cef0: 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d  / "datatype mism
cf00: 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51  atch",.    /* SQ
cf10: 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20  LITE_MISUSE     
cf20: 20 2a 2f 20 22 62 61 64 20 70 61 72 61 6d 65 74   */ "bad paramet
cf30: 65 72 20 6f 72 20 6f 74 68 65 72 20 41 50 49 20  er or other API 
cf40: 6d 69 73 75 73 65 22 2c 0a 23 69 66 64 65 66 20  misuse",.#ifdef 
cf50: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
cf60: 46 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  FS.    /* SQLITE
cf70: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
cf80: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
cf90: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
cfa0: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53  ,.#else.    /* S
cfb0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
cfc0: 20 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20    */ 0,.#endif. 
cfd0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54     /* SQLITE_AUT
cfe0: 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74  H        */ "aut
cff0: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
d000: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
d010: 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f  E_FORMAT      */
d020: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
d030: 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f  E_RANGE       */
d040: 20 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f   "column index o
d050: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
d060: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
d070: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
d080: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
d090: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
d0a0: 54 45 5f 4e 4f 54 49 43 45 20 20 20 20 20 20 2a  TE_NOTICE      *
d0b0: 2f 20 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20  / "notification 
d0c0: 6d 65 73 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a  message",.    /*
d0d0: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20   SQLITE_WARNING 
d0e0: 20 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20      */ "warning 
d0f0: 6d 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20  message",.  };. 
d100: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
d110: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
d120: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
d130: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
d140: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
d150: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
d160: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
d170: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
d180: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d190: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d1a0: 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ROW: {.      zEr
d1b0: 72 20 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f 77  r = "another row
d1c0: 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20   available";.   
d1d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d1e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d1f0: 44 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45  DONE: {.      zE
d200: 72 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f  rr = "no more ro
d210: 77 73 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20  ws available";. 
d220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d230: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
d240: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
d250: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
d260: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
d270: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
d280: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
d290: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
d2a0: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
d2b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d2d0: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
d2e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d2f0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
d300: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
d310: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
d320: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
d330: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
d340: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
d350: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
d360: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
d370: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d380: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
d390: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
d3a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
d3b0: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
d3c0: 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 6c 6f   to retry the lo
d3d0: 63 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ck.  Return zero
d3e0: 20 74 6f 20 73 74 6f 70 20 74 72 79 69 6e 67 0a   to stop trying.
d3f0: 2a 2a 20 61 6e 64 20 63 61 75 73 65 20 53 51 4c  ** and cause SQL
d400: 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ite to return SQ
d410: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74  LITE_BUSY..*/.st
d420: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
d430: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
d440: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c  ck(.  void *ptr,
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d460: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d470: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63  ction */.  int c
d480: 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ount,           
d490: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d4a0: 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73   times table has
d4b0: 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   been busy */.  
d4c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
d4d0: 69 6c 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ile      /* The 
d4e0: 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68  file on which th
d4f0: 65 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64 20  e lock occurred 
d500: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
d510: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
d520: 55 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69 73  USLEEP.  /* This
d530: 20 63 61 73 65 20 69 73 20 66 6f 72 20 73 79 73   case is for sys
d540: 74 65 6d 73 20 74 68 61 74 20 68 61 76 65 20 73  tems that have s
d550: 75 70 70 6f 72 74 20 66 6f 72 20 73 6c 65 65 70  upport for sleep
d560: 69 6e 67 20 66 6f 72 20 66 72 61 63 74 69 6f 6e  ing for fraction
d570: 73 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f  s of.  ** a seco
d580: 6e 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20  nd.  Examples:  
d590: 41 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79 73 74  All windows syst
d5a0: 65 6d 73 2c 20 75 6e 69 78 20 73 79 73 74 65 6d  ems, unix system
d5b0: 73 20 77 69 74 68 20 75 73 6c 65 65 70 28 29 20  s with usleep() 
d5c0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
d5d0: 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a  t u8 delays[] =.
d5e0: 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20       { 1, 2, 5, 
d5f0: 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20  10, 15, 20, 25, 
d600: 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35  25,  25,  50,  5
d610: 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74  0, 100 };.  stat
d620: 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61  ic const u8 tota
d630: 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c  ls[] =.     { 0,
d640: 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33   1, 3,  8, 18, 3
d650: 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20  3, 53, 78, 103, 
d660: 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b  128, 178, 228 };
d670: 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59  .# define NDELAY
d680: 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79   ArraySize(delay
d690: 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s).  sqlite3 *db
d6a0: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
d6b0: 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d  r;.  int tmout =
d6c0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d6d0: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
d6e0: 72 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53 51  rior;..#ifdef SQ
d6f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
d700: 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66 28 20  K_TIMEOUT.  if( 
d710: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
d720: 74 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54  trol(pFile,SQLIT
d730: 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d  E_FCNTL_LOCK_TIM
d740: 45 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51  EOUT,&tmout)==SQ
d750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
d760: 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20  f( count ){.    
d770: 20 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20    tmout = 0;.   
d780: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
d790: 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53  Control(pFile, S
d7a0: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
d7b0: 5f 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74  _TIMEOUT, &tmout
d7c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d7d0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
d7e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d7f0: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
d800: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d810: 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
d820: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
d830: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
d840: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
d850: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
d860: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
d870: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
d880: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
d890: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
d8a0: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
d8b0: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
d8c0: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
d8d0: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
d8e0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
d8f0: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d  ior + delay > tm
d900: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
d910: 20 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72   = tmout - prior
d920: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
d930: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d940: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
d950: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
d960: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
d970: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f  urn 1;.#else.  /
d980: 2a 20 54 68 69 73 20 63 61 73 65 20 66 6f 72 20  * This case for 
d990: 75 6e 69 78 20 73 79 73 74 65 6d 73 20 74 68 61  unix systems tha
d9a0: 74 20 6c 61 63 6b 20 75 73 6c 65 65 70 28 29 20  t lack usleep() 
d9b0: 73 75 70 70 6f 72 74 2e 20 20 53 6c 65 65 70 69  support.  Sleepi
d9c0: 6e 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  ng.  ** must be 
d9d0: 64 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e  done in incremen
d9e0: 74 73 20 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f  ts of whole seco
d9f0: 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nds */.  sqlite3
da00: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
da10: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f  *)ptr;.  int tmo
da20: 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a  ut = ((sqlite3 *
da30: 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f  )ptr)->busyTimeo
da40: 75 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ut;.  UNUSED_PAR
da50: 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a 20  AMETER(pFile);. 
da60: 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31   if( (count+1)*1
da70: 30 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20  000 > tmout ){. 
da80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
da90: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
daa0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
dab0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
dac0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
dad0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
dae0: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
daf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
db00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
db10: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
db20: 66 61 69 6c 65 64 20 74 6f 20 61 63 71 75 69 72  failed to acquir
db30: 65 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56  e a.** lock on V
db40: 46 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a  FS file pFile..*
db50: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
db60: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
db70: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
db80: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
db90: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
dba0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
dbb0: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
dbc0: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
dbd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
dbe0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
dbf0: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c  (BusyHandler *p,
dc00: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
dc10: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  File){.  int rc;
dc20: 0a 20 20 69 66 28 20 70 2d 3e 78 42 75 73 79 48  .  if( p->xBusyH
dc30: 61 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e  andler==0 || p->
dc40: 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e  nBusy<0 ) return
dc50: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45 78   0;.  if( p->bEx
dc60: 74 72 61 46 69 6c 65 41 72 67 20 29 7b 0a 20 20  traFileArg ){.  
dc70: 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 78 74 72    /* Add an extr
dc80: 61 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68  a parameter with
dc90: 20 74 68 65 20 70 46 69 6c 65 20 70 6f 69 6e 74   the pFile point
dca0: 65 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  er to the end of
dcb0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   the.    ** call
dcc0: 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69  back argument li
dcd0: 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a  st */.    int (*
dce0: 78 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  xTra)(void*,int,
dcf0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
dd00: 20 20 20 20 78 54 72 61 20 3d 20 28 69 6e 74 28      xTra = (int(
dd10: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c  *)(void*,int,sql
dd20: 69 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78  ite3_file*))p->x
dd30: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
dd40: 20 72 63 20 3d 20 78 54 72 61 28 70 2d 3e 70 42   rc = xTra(p->pB
dd50: 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  usyArg, p->nBusy
dd60: 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73  , pFile);.  }els
dd70: 65 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63 79  e{.    /* Legacy
dd80: 20 73 74 79 6c 65 20 62 75 73 79 20 68 61 6e 64   style busy hand
dd90: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ler callback */.
dda0: 20 20 20 20 72 63 20 3d 20 70 2d 3e 78 42 75 73      rc = p->xBus
ddb0: 79 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73  yHandler(p->pBus
ddc0: 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b  yArg, p->nBusy);
ddd0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
dde0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
ddf0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
de00: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
de10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
de20: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
de30: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
de40: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
de50: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
de60: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
de70: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
de80: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
de90: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
dea0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
deb0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
dec0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
ded0: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
dee0: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
def0: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
df00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
df10: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
df20: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
df30: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
df40: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
df50: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
df60: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
df70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
df80: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78  b->busyHandler.x
df90: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
dfa0: 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  usy;.  db->busyH
dfb0: 61 6e 64 6c 65 72 2e 70 42 75 73 79 41 72 67 20  andler.pBusyArg 
dfc0: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
dfd0: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
dfe0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
dff0: 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c  andler.bExtraFil
e000: 65 41 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eArg = 0;.  db->
e010: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b  busyTimeout = 0;
e020: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
e030: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
e040: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
e050: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
e060: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
e070: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
e080: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e090: 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67  ne sets the prog
e0a0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ress callback fo
e0b0: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
e0c0: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
e0d0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
e0e0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
e0f0: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  given argument. 
e100: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
e110: 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65  lback will.** be
e120: 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e   invoked every n
e130: 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  Ops opcodes..*/.
e140: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f  void sqlite3_pro
e150: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20  gress_handler(. 
e160: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
e170: 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74   int nOps,.  int
e180: 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f   (*xProgress)(vo
e190: 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70  id*), .  void *p
e1a0: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
e1b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e1c0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
e1d0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
e1e0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
e1f0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
e200: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
e210: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
e220: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e230: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e240: 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a    if( nOps>0 ){.
e250: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
e260: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
e270: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
e280: 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Ops = (unsigned)
e290: 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50  nOps;.    db->pP
e2a0: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72  rogressArg = pAr
e2b0: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
e2c0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
e2d0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  0;.    db->nProg
e2e0: 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20  ressOps = 0;.   
e2f0: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
e300: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  g = 0;.  }.  sql
e310: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e320: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  (db->mutex);.}.#
e330: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
e340: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
e350: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
e360: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
e370: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
e380: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
e390: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
e3a0: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
e3b0: 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ng 0..*/.int sql
e3c0: 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
e3d0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
e3e0: 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53  nt ms){.#ifdef S
e3f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e400: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e410: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e420: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
e430: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e440: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
e450: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c   ms>0 ){.    sql
e460: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
e470: 72 28 64 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f  r(db, (int(*)(vo
e480: 69 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65 44  id*,int))sqliteD
e490: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
e4a0: 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20   (void*)db);.   
e4d0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
e4e0: 20 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62   = ms;.    db->b
e4f0: 75 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72  usyHandler.bExtr
e500: 61 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20  aFileArg = 1;.  
e510: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e520: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
e530: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
e540: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e550: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
e560: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
e570: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
e580: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
e590: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
e5a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
e5b0: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
e5c0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
e5d0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e5e0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
e5f0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
e600: 64 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c  db) && (db==0 ||
e610: 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49   db->magic!=SQLI
e620: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29  TE_MAGIC_ZOMBIE)
e630: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e640: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e650: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
e660: 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75  }.#endif.  db->u
e670: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
e680: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
e690: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e6a0: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
e6b0: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
e6c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
e6d0: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
e6e0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
e6f0: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
e700: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
e710: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
e720: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
e730: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
e740: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e750: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
e760: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
e770: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
e780: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
e790: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
e7a0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
e7b0: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
e7c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e7d0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
e7e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e7f0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
e800: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
e810: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e820: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e830: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e840: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e850: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e860: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e870: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e880: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e890: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
e8a0: 76 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73  void (*xValue)(s
e8b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
e8c0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e 76 65  ,.  void (*xInve
e8d0: 72 73 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  rse)(sqlite3_con
e8e0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e8f0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 46  3_value **),.  F
e900: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
e910: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
e920: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
e930: 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65  t nName;.  int e
e940: 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73  xtraFlags;..  as
e950: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e960: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
e970: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e980: 20 78 56 61 6c 75 65 3d 3d 30 20 7c 7c 20 78 53   xValue==0 || xS
e990: 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Func==0 );.  if(
e9a0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d   zFunctionName==
e9b0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
e9c0: 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 20   /* Must have a 
e9d0: 76 61 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  valid name */.  
e9e0: 20 7c 7c 20 28 78 53 46 75 6e 63 21 3d 30 20 26   || (xSFunc!=0 &
e9f0: 26 20 78 46 69 6e 61 6c 21 3d 30 29 20 20 20 20  & xFinal!=0)    
ea00: 20 20 20 20 2f 2a 20 4e 6f 74 20 62 6f 74 68 20      /* Not both 
ea10: 78 53 46 75 6e 63 20 61 6e 64 20 78 46 69 6e 61  xSFunc and xFina
ea20: 6c 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 46 69  l */.   || ((xFi
ea30: 6e 61 6c 3d 3d 30 29 21 3d 28 78 53 74 65 70 3d  nal==0)!=(xStep=
ea40: 3d 30 29 29 20 20 20 20 20 20 20 2f 2a 20 42 6f  =0))       /* Bo
ea50: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66  th or neither of
ea60: 20 78 46 69 6e 61 6c 20 61 6e 64 20 78 53 74 65   xFinal and xSte
ea70: 70 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 56 61  p */.   || ((xVa
ea80: 6c 75 65 3d 3d 30 29 21 3d 28 78 49 6e 76 65 72  lue==0)!=(xInver
ea90: 73 65 3d 3d 30 29 29 20 20 20 20 2f 2a 20 42 6f  se==0))    /* Bo
eaa0: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66  th or neither of
eab0: 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73   xValue, xInvers
eac0: 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41 72 67  e */.   || (nArg
ead0: 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49  <-1 || nArg>SQLI
eae0: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
eaf0: 41 52 47 29 0a 20 20 20 7c 7c 20 28 32 35 35 3c  ARG).   || (255<
eb00: 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  (nName = sqlite3
eb10: 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74  Strlen30( zFunct
eb20: 69 6f 6e 4e 61 6d 65 29 29 29 0a 20 20 29 7b 0a  ionName))).  ){.
eb30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eb40: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
eb50: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
eb60: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41  LITE_FUNC_CONSTA
eb70: 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52  NT==SQLITE_DETER
eb80: 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78  MINISTIC );.  ex
eb90: 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26  traFlags = enc &
eba0: 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49    SQLITE_DETERMI
ebb0: 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d  NISTIC;.  enc &=
ebc0: 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e   (SQLITE_FUNC_EN
ebd0: 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59  CMASK|SQLITE_ANY
ebe0: 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51  );.  .#ifndef SQ
ebf0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
ec00: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
ec10: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
ec20: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
ec30: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
ec40: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
ec50: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
ec60: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
ec70: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
ec80: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
ec90: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
eca0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
ecb0: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
ecc0: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
ecd0: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
ece0: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
ecf0: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
ed00: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
ed10: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
ed20: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
ed30: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
ed40: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
ed50: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
ed60: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
ed70: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
ed80: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
ed90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
eda0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
edb0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
edc0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65  g, SQLITE_UTF8|e
edd0: 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20  xtraFlags,.     
ede0: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
edf0: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  SFunc, xStep, xF
ee00: 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49  inal, xValue, xI
ee10: 6e 76 65 72 73 65 2c 20 70 44 65 73 74 72 75 63  nverse, pDestruc
ee20: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tor);.    if( rc
ee30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ee40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ee50: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ee60: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
ee70: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
ee80: 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  6LE|extraFlags,.
ee90: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
eea0: 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  ata, xSFunc, xSt
eeb0: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c  ep, xFinal, xVal
eec0: 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70 44  ue, xInverse, pD
eed0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
eee0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
eef0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ef00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ef10: 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  }.    enc = SQLI
ef20: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a  TE_UTF16BE;.  }.
ef30: 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51  #else.  enc = SQ
ef40: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69  LITE_UTF8;.#endi
ef50: 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  f.  .  /* Check 
ef60: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66  if an existing f
ef70: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
ef80: 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64   overridden or d
ef90: 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20  eleted. If so,. 
efa0: 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
efb0: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68  e active VMs, th
efc0: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
efd0: 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63  _BUSY. If a func
efe0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69  tion.  ** is bei
eff0: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65  ng overridden/de
f000: 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20  leted but there 
f010: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
f020: 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a  s, allow the.  *
f030: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63  * operation to c
f040: 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61  ontinue but inva
f050: 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f  lidate all preco
f060: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
f070: 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  s..  */.  p = sq
f080: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
f090: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
f0a0: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
f0b0: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
f0c0: 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73  && (p->funcFlags
f0d0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
f0e0: 4e 43 4d 41 53 4b 29 3d 3d 28 75 33 32 29 65 6e  NCMASK)==(u32)en
f0f0: 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41  c && p->nArg==nA
f100: 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  rg ){.    if( db
f110: 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
f120: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f130: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
f140: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
f150: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
f160: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73  delete/modify us
f170: 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20  er-function due 
f180: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
f190: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73  ents");.      as
f1a0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
f1b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
f1c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
f1d0: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
f1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f1f0: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
f200: 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20  ments(db, 0);.  
f210: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
f220: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
f230: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
f240: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
f250: 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  enc, 1);.  asser
f260: 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  t(p || db->mallo
f270: 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
f280: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
f290: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f2a0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
f2b0: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
f2c0: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
f2d0: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
f2e0: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
f2f0: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
f300: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
f310: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
f320: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
f330: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
f340: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
f350: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
f360: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
f370: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
f380: 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  u.pDestructor = 
f390: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
f3a0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70  ->funcFlags = (p
f3b0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
f3c0: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
f3d0: 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b  K) | extraFlags;
f3e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
f3f0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
f400: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
f410: 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20   );.  p->xSFunc 
f420: 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e  = xSFunc ? xSFun
f430: 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  c : xStep;.  p->
f440: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
f450: 61 6c 3b 0a 20 20 70 2d 3e 78 56 61 6c 75 65 20  al;.  p->xValue 
f460: 3d 20 78 56 61 6c 75 65 3b 0a 20 20 70 2d 3e 78  = xValue;.  p->x
f470: 49 6e 76 65 72 73 65 20 3d 20 78 49 6e 76 65 72  Inverse = xInver
f480: 73 65 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  se;.  p->pUserDa
f490: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
f4a0: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36    p->nArg = (u16
f4b0: 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  )nArg;.  return 
f4c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f4d0: 0a 2a 2a 20 57 6f 72 6b 65 72 20 66 75 6e 63 74  .** Worker funct
f4e0: 69 6f 6e 20 75 73 65 64 20 62 79 20 75 74 66 2d  ion used by utf-
f4f0: 38 20 41 50 49 73 20 74 68 61 74 20 63 72 65 61  8 APIs that crea
f500: 74 65 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 73  te new functions
f510: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
f520: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f530: 6f 6e 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74  on().**    sqlit
f540: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f550: 6f 6e 5f 76 32 28 29 0a 2a 2a 20 20 20 20 73 71  on_v2().**    sq
f560: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e  lite3_create_win
f570: 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a  dow_function().*
f580: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
f590: 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 0a  ateFunctionApi(.
f5a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f5b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
f5c0: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
f5d0: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
f5e0: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
f5f0: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
f600: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
f610: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
f620: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
f630: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
f640: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
f650: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
f660: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
f670: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
f680: 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65  (*xValue)(sqlite
f690: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
f6a0: 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28  oid (*xInverse)(
f6b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f6c0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
f6d0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  ue**),.  void(*x
f6e0: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 0a  Destroy)(void*).
f6f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f700: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75  LITE_ERROR;.  Fu
f710: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41  ncDestructor *pA
f720: 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  rg = 0;..#ifdef 
f730: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f740: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f750: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f760: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
f770: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
f780: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
f790: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
f7a0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f7b0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
f7c0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
f7d0: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
f7e0: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  tor *)sqlite3Mal
f7f0: 6c 6f 63 28 73 69 7a 65 6f 66 28 46 75 6e 63 44  loc(sizeof(FuncD
f800: 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20  estructor));.   
f810: 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20   if( !pArg ){.  
f820: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
f830: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 78  ult(db);.      x
f840: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
f850: 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20    goto out;.    
f860: 7d 0a 20 20 20 20 70 41 72 67 2d 3e 6e 52 65 66  }.    pArg->nRef
f870: 20 3d 20 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e   = 0;.    pArg->
f880: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
f890: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
f8a0: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
f8b0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
f8c0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
f8d0: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
f8e0: 20 70 2c 20 0a 20 20 20 20 20 20 78 53 46 75 6e   p, .      xSFun
f8f0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
f900: 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72  , xValue, xInver
f910: 73 65 2c 20 70 41 72 67 0a 20 20 29 3b 0a 20 20  se, pArg.  );.  
f920: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
f930: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
f940: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
f950: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
f960: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
f970: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72 67  qlite3_free(pArg
f980: 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20  );.  }.. out:.  
f990: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
f9a0: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
f9b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f9c0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f9d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f9e0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
f9f0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
fa00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
fa10: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
fa20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
fa30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
fa40: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
fa50: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
fa60: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
fa70: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
fa80: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
fa90: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
faa0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
fab0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
fac0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
fad0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
fae0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
faf0: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72  context*).){.  r
fb00: 65 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63  eturn createFunc
fb10: 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e  tionApi(db, zFun
fb20: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
fb30: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a   xSFunc, xStep,.
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30      xFinal, 0, 0
fb70: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
fb80: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
fb90: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
fba0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
fbb0: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
fbc0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
fbd0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
fbe0: 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73  void (*xSFunc)(s
fbf0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
fc00: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
fc10: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
fc20: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
fc30: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
fc40: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
fc50: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
fc60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
fc70: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  ),.  void (*xDes
fc80: 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b  troy)(void *).){
fc90: 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61 74 65  .  return create
fca0: 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20  FunctionApi(db, 
fcb0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
fcc0: 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  , p, xSFunc, xSt
fcd0: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcf0: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
fd00: 30 2c 20 30 2c 20 78 44 65 73 74 72 6f 79 29 3b  0, 0, xDestroy);
fd10: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  .}.int sqlite3_c
fd20: 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e  reate_window_fun
fd30: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
fd40: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
fd50: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
fd60: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
fd70: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
fd80: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
fd90: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
fda0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
fdb0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
fdc0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
fdd0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
fde0: 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65  (*xValue)(sqlite
fdf0: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
fe00: 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28  oid (*xInverse)(
fe10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
fe20: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
fe30: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
fe40: 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20  *xDestroy)(void 
fe50: 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  *).){.  return c
fe60: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69  reateFunctionApi
fe70: 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67  (db, zFunc, nArg
fe80: 2c 20 65 6e 63 2c 20 70 2c 20 30 2c 20 78 53 74  , enc, p, 0, xSt
fe90: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
fec0: 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65  xValue, xInverse
fed0: 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a  , xDestroy);.}..
fee0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fef0: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
ff00: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
ff10: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
ff20: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
ff30: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
ff40: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
ff50: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
ff60: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
ff70: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
ff80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
ff90: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
ffa0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
ffb0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
ffc0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
ffd0: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
ffe0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
fff0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
10000 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
10010 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64  r *zFunc8;..#ifd
10020 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10030 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
10040 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
10050 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46  heckOk(db) || zF
10060 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29  unctionName==0 )
10070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10080 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
10090 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
100a0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
100b0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
100c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
100d0 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
100e0 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
100f0 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
10100 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
10110 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
10120 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
10130 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
10140 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
10150 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c  p, xSFunc,xStep,
10160 78 46 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20  xFinal,0,0,0);. 
10170 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10180 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63  b, zFunc8);.  rc
10190 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
101a0 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
101b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
101c0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
101d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
101e0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
101f0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
10200 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
10210 66 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f  f an SQL functio
10220 6e 20 74 68 61 74 20 61 6c 77 61 79 73 0a 2a 2a  n that always.**
10230 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20 65   fails with an e
10240 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 61  rror message sta
10250 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 66 75  ting that the fu
10260 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  nction is used i
10270 6e 20 74 68 65 0a 2a 2a 20 77 72 6f 6e 67 20 63  n the.** wrong c
10280 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 73 71 6c  ontext.  The sql
10290 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
102a0 6e 63 74 69 6f 6e 28 29 20 41 50 49 20 6d 69 67  nction() API mig
102b0 68 74 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20  ht construct.** 
102c0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  SQL function tha
102d0 74 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  t use this routi
102e0 6e 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  ne so that the f
102f0 75 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20 65 78  unctions will ex
10300 69 73 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65 20  ist.** for name 
10310 72 65 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20 61  resolution but a
10320 72 65 20 61 63 74 75 61 6c 6c 79 20 6f 76 65 72  re actually over
10330 6c 6f 61 64 65 64 20 62 79 20 74 68 65 20 78 46  loaded by the xF
10340 69 6e 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  indFunction.** m
10350 65 74 68 6f 64 20 6f 66 20 76 69 72 74 75 61 6c  ethod of virtual
10360 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
10370 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 49  ic void sqlite3I
10380 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 28 0a  nvalidFunction(.
10390 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
103a0 74 20 2a 63 6f 6e 74 65 78 74 2c 20 20 2f 2a 20  t *context,  /* 
103b0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  The function cal
103c0 6c 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ling context */.
103d0 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 20    int NotUsed,  
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
103f0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
10400 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
10410 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
10420 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
10430 32 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20  2   /* Value of 
10440 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
10450 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
10460 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
10470 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 75   char*)sqlite3_u
10480 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
10490 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  );.  char *zErr;
104a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
104b0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
104c0 74 55 73 65 64 32 29 3b 0a 20 20 7a 45 72 72 20  tUsed2);.  zErr 
104d0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
104e0 66 28 0a 20 20 20 20 20 20 22 75 6e 61 62 6c 65  f(.      "unable
104f0 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
10500 20 25 73 20 69 6e 20 74 68 65 20 72 65 71 75 65   %s in the reque
10510 73 74 65 64 20 63 6f 6e 74 65 78 74 22 2c 20 7a  sted context", z
10520 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
10530 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
10540 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29  ntext, zErr, -1)
10550 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
10560 28 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (zErr);.}../*.**
10570 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
10580 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
10590 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
105a0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
105b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
105c0 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
105d0 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
105e0 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
105f0 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
10600 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
10610 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
10620 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
10630 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
10640 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
10650 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
10660 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
10670 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
10680 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
10690 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
106a0 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
106b0 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
106c0 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
106d0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
106e0 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
106f0 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
10700 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
10710 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
10720 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
10730 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
10740 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
10750 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
10760 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
10770 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
10780 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
10790 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
107a0 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
107b0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70  rc;.  char *zCop
107c0 79 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  y;..#ifdef SQLIT
107d0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
107e0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
107f0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10800 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c  b) || zName==0 |
10810 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20  | nArg<-2 ){.   
10820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10830 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
10840 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
10850 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
10860 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20  >mutex);.  rc = 
10870 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
10880 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
10890 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
108a0 2c 20 30 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  , 0)!=0;.  sqlit
108b0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
108c0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
108d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 53 51 4c   rc ) return SQL
108e0 49 54 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20  ITE_OK;.  zCopy 
108f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10900 66 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  f(zName);.  if( 
10910 7a 43 6f 70 79 3d 3d 30 20 29 20 72 65 74 75 72  zCopy==0 ) retur
10920 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10930 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
10940 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
10950 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  _v2(db, zName, n
10960 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
10970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
10990 70 79 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c  py, sqlite3Inval
109a0 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
109b0 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
109c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
109d0 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
109e0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
109f0 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
10a00 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
10a10 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
10a20 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
10a30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
10a40 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
10a50 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
10a60 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
10a70 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
10a80 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
10a90 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
10aa0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
10ab0 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
10ac0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
10ad0 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
10ae0 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ment..*/.#ifndef
10af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
10b00 52 45 43 41 54 45 44 0a 76 6f 69 64 20 2a 73 71  RECATED.void *sq
10b10 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69  lite3_trace(sqli
10b20 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78  te3 *db, void(*x
10b30 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  Trace)(void*,con
10b40 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20  st char*), void 
10b50 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a  *pArg){.  void *
10b60 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOld;..#ifdef SQ
10b70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
10b80 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
10b90 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
10ba0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
10bb0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
10bc0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
10bd0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
10be0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10bf0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10c00 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
10c10 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e  TraceArg;.  db->
10c20 6d 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 20  mTrace = xTrace 
10c30 3f 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c  ? SQLITE_TRACE_L
10c40 45 47 41 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d  EGACY : 0;.  db-
10c50 3e 78 54 72 61 63 65 20 3d 20 28 69 6e 74 28 2a  >xTrace = (int(*
10c60 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64  )(u32,void*,void
10c70 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61 63 65 3b  *,void*))xTrace;
10c80 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
10c90 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
10ca0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10cb0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10cc0 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64  urn pOld;.}.#end
10cd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10ce0 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a  T_DEPRECATED */.
10cf0 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  ./* Register a t
10d00 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 75 73  race callback us
10d10 69 6e 67 20 74 68 65 20 76 65 72 73 69 6f 6e 2d  ing the version-
10d20 32 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  2 interface..*/.
10d30 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63  int sqlite3_trac
10d40 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  e_v2(.  sqlite3 
10d50 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 20 20 2f 2a 20 54 72 61 63 65 20 74 68 69 73     /* Trace this
10d80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
10d90 20 75 6e 73 69 67 6e 65 64 20 6d 54 72 61 63 65   unsigned mTrace
10da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10dc0 61 73 6b 20 6f 66 20 65 76 65 6e 74 73 20 74 6f  ask of events to
10dd0 20 62 65 20 74 72 61 63 65 64 20 2a 2f 0a 20 20   be traced */.  
10de0 69 6e 74 28 2a 78 54 72 61 63 65 29 28 75 6e 73  int(*xTrace)(uns
10df0 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64  igned,void*,void
10e00 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61  *,void*),  /* Ca
10e10 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65  llback to invoke
10e20 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29   /* Context */.)
10e60 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
10e70 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10e80 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10e90 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10ea0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10eb0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10ec0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
10ed0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10ee0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10ef0 20 20 69 66 28 20 6d 54 72 61 63 65 3d 3d 30 20    if( mTrace==0 
10f00 29 20 78 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  ) xTrace = 0;.  
10f10 69 66 28 20 78 54 72 61 63 65 3d 3d 30 20 29 20  if( xTrace==0 ) 
10f20 6d 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 64 62  mTrace = 0;.  db
10f30 2d 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72 61 63  ->mTrace = mTrac
10f40 65 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  e;.  db->xTrace 
10f50 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
10f60 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
10f70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
10f80 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
10f90 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
10fa0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
10fb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
10fc0 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
10fd0 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69  Register a profi
10fe0 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  le function.  Th
10ff0 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
11000 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
11010 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c  tered .** profil
11020 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  e function is re
11030 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
11040 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66  A NULL profile f
11050 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
11060 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20  at no profiling 
11070 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
11080 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66  non-NULL.** prof
11090 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ile is a pointer
110a0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
110b0 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
110c0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
110d0 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20   of.** each SQL 
110e0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
110f0 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  s run..*/.void *
11100 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
11110 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
11120 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c    void (*xProfil
11130 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
11140 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74  har*,sqlite_uint
11150 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
11160 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  g.){.  void *pOl
11170 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
11180 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
11190 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
111a0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
111b0 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
111c0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
111d0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
111e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
111f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
11200 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
11210 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
11220 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
11230 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
11240 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
11250 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
11260 64 62 2d 3e 6d 54 72 61 63 65 20 26 3d 20 53 51  db->mTrace &= SQ
11270 4c 49 54 45 5f 54 52 41 43 45 5f 4e 4f 4e 4c 45  LITE_TRACE_NONLE
11280 47 41 43 59 5f 4d 41 53 4b 3b 0a 20 20 69 66 28  GACY_MASK;.  if(
11290 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 29 20   db->xProfile ) 
112a0 64 62 2d 3e 6d 54 72 61 63 65 20 7c 3d 20 53 51  db->mTrace |= SQ
112b0 4c 49 54 45 5f 54 52 41 43 45 5f 58 50 52 4f 46  LITE_TRACE_XPROF
112c0 49 4c 45 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ILE;.  sqlite3_m
112d0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
112e0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
112f0 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
11300 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
11310 50 52 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64  PRECATED */.#end
11320 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11330 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  T_TRACE */../*.*
11340 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e  * Register a fun
11350 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
11360 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  ked when a trans
11370 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a  action commits..
11380 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65  ** If the invoke
11390 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  d function retur
113a0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
113b0 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63  n the commit bec
113c0 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61  omes a.** rollba
113d0 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ck..*/.void *sql
113e0 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
113f0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11410 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
11420 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
11430 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61  e */.  int (*xCa
11440 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
11450 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
11460 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63  invoke on each c
11470 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20  ommit */.  void 
11480 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
11490 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
114a0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
114b0 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
114c0 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
114d0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
114e0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
114f0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
11500 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
11510 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
11520 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
11530 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
11540 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11550 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11560 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43  .  pOld = db->pC
11570 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e  ommitArg;.  db->
11580 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
11590 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
115a0 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20  b->pCommitArg = 
115b0 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
115c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
115d0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
115e0 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOld;.}../*.** 
115f0 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
11600 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
11610 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
11620 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
11630 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
11640 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
11650 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11660 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
11670 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
11680 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
11690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
116a0 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
116b0 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
116c0 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
116d0 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
116e0 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  int,char const *
116f0 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71  ,char const *,sq
11700 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76  lite_int64),.  v
11710 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
11720 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
11730 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
11740 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
11750 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66  d *pRet;..#ifdef
11760 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
11770 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
11780 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
11790 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
117a0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
117b0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
117c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
117d0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
117e0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
117f0 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
11800 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20  ->pUpdateArg;.  
11810 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
11820 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
11830 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72  .  db->pUpdateAr
11840 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
11850 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11860 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11870 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
11880 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
11890 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
118a0 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
118b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
118c0 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
118d0 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
118e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
118f0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f  void *sqlite3_ro
11900 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73  llback_hook(.  s
11910 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
11920 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
11930 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
11940 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
11950 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
11960 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43  ck)(void*), /* C
11970 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
11980 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
119b0 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
119c0 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
119d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
119e0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
119f0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
11a00 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
11a10 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
11a20 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
11a30 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11a40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
11a50 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11a60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
11a70 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  et = db->pRollba
11a80 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f  ckArg;.  db->xRo
11a90 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d  llbackCallback =
11aa0 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
11ab0 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d  ->pRollbackArg =
11ac0 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
11ad0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11ae0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11af0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  n pRet;.}..#ifde
11b00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11b10 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f  PREUPDATE_HOOK./
11b20 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
11b30 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
11b40 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
11b50 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
11b60 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
11b70 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
11b80 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
11b90 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
11ba0 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70  d *sqlite3_preup
11bb0 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  date_hook(.  sql
11bc0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
11bd0 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
11be0 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
11bf0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
11c00 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29  void(*xCallback)
11c10 28 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c  (         /* Cal
11c20 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
11c30 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69  /.    void*,sqli
11c40 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  te3*,int,char co
11c50 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a  nst*,char const*
11c60 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73  ,sqlite3_int64,s
11c70 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20  qlite3_int64),. 
11c80 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
11c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
11ca0 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67  rst callback arg
11cb0 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ument */.){.  vo
11cc0 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
11cd0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11ce0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
11cf0 65 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64  et = db->pPreUpd
11d00 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ateArg;.  db->xP
11d10 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  reUpdateCallback
11d20 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
11d30 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
11d40 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
11d50 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11d60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11d70 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
11d80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
11d90 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
11da0 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  OOK */..#ifndef 
11db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
11dc0 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
11dd0 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
11de0 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
11df0 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   by sqlite3_wal_
11e00 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
11e10 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ..** Invoke sqli
11e20 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
11e30 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72  nt if the number
11e40 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
11e50 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73  e log file.** is
11e60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71   greater than sq
11e70 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61  lite3.pWalArg ca
11e80 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  st to an integer
11e90 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66   (the value conf
11ea0 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c  igured by.** wal
11eb0 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
11ec0 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ))..*/ .int sqli
11ed0 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
11ee0 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65  k(.  void *pClie
11ef0 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41  ntData,     /* A
11f00 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  rgument */.  sql
11f10 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
11f20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
11f30 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
11f40 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a  r *zDb,       /*
11f50 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   Database */.  i
11f60 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20  nt nFrame       
11f70 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11f80 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28   WAL */.){.  if(
11f90 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f   nFrame>=SQLITE_
11fa0 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65  PTR_TO_INT(pClie
11fb0 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73  ntData) ){.    s
11fc0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
11fd0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73  nMalloc();.    s
11fe0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
11ff0 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a  point(db, zDb);.
12000 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
12010 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
12020 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12030 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
12040 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
12050 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  L */../*.** Conf
12060 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33  igure an sqlite3
12070 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
12080 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69  back to automati
12090 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
120a0 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
120b0 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fter committing 
120c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  a transaction if
120d0 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d   there are nFram
120e0 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61  e or.** more fra
120f0 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
12100 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72  ile. Passing zer
12110 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20  o or a negative 
12120 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20  value as the.** 
12130 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72  nFrame parameter
12140 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61   disables automa
12150 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  tic checkpoints 
12160 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  entirely..**.** 
12170 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  The callback reg
12180 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20  istered by this 
12190 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65  function replace
121a0 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63  s any existing c
121b0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73  allback.** regis
121c0 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69  tered using sqli
121d0 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20  te3_wal_hook(). 
121e0 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74  Likewise, regist
121f0 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b  ering a callback
12200 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65  .** using sqlite
12210 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73  3_wal_hook() dis
12220 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61  ables the automa
12230 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d  tic checkpoint m
12240 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66  echanism.** conf
12250 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66  igured by this f
12260 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
12270 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
12280 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
12290 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61  e3 *db, int nFra
122a0 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  me){.#ifdef SQLI
122b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e  TE_OMIT_WAL.  UN
122c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
122d0 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  b);.  UNUSED_PAR
122e0 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a  AMETER(nFrame);.
122f0 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c  #else.#ifdef SQL
12300 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
12310 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
12320 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
12330 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
12340 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12350 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e  ;.#endif.  if( n
12360 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73  Frame>0 ){.    s
12370 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
12380 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65  db, sqlite3WalDe
12390 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54  faultHook, SQLIT
123a0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72  E_INT_TO_PTR(nFr
123b0 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ame));.  }else{.
123c0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
123d0 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a  hook(db, 0, 0);.
123e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
123f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12400 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
12410 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
12420 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
12430 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
12440 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  n is written.** 
12450 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61  into the write-a
12460 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73  head-log by this
12470 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12480 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
12490 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
124a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
124d0 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62   hook to this db
124e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
124f0 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
12500 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  d *, sqlite3*, c
12510 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
12520 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
12550 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
12560 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29  xCallback() */.)
12570 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
12580 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64  _OMIT_WAL.  void
12590 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53   *pRet;.#ifdef S
125a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
125b0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
125c0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
125d0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
125e0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
125f0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
12600 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
12610 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12620 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
12630 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
12640 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78  pWalArg;.  db->x
12650 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  WalCallback = xC
12660 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
12670 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  WalArg = pArg;. 
12680 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12690 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
126a0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
126b0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
126c0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
126d0 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
126e0 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e  abase zDb..*/.in
126f0 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
12700 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73  eckpoint_v2(.  s
12710 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12730 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
12740 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
12750 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
12760 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
12770 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
12780 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ase (or NULL) */
12790 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20  .  int eMode,   
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45     /* SQLITE_CHE
127c0 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20  CKPOINT_* value 
127d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  */.  int *pnLog,
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
12800 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20  e of WAL log in 
12810 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20  frames */.  int 
12820 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20  *pnCkpt         
12830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12840 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72  UT: Total number
12850 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b   of frames check
12860 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69  pointed */.){.#i
12870 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12880 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51  _WAL.  return SQ
12890 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
128a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
128d0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53  */.  int iDb = S
128e0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
128f0 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e  ED;  /* sqlite3.
12900 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64  aDb[] index of d
12910 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  b to checkpoint 
12920 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
12930 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
12940 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
12950 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
12960 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
12970 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12980 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69  #endif..  /* Ini
12990 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70  tialize the outp
129a0 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ut variables to 
129b0 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  -1 in case an er
129c0 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
129d0 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e   if( pnLog ) *pn
129e0 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Log = -1;.  if( 
129f0 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74  pnCkpt ) *pnCkpt
12a00 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74   = -1;..  assert
12a10 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
12a20 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29  INT_PASSIVE==0 )
12a30 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
12a40 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
12a50 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  LL==1 );.  asser
12a60 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
12a70 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20  OINT_RESTART==2 
12a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
12a90 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
12aa0 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20  RUNCATE==3 );.  
12ab0 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
12ac0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
12ad0 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
12ae0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
12af0 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f  RUNCATE ){.    /
12b00 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
12b10 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54 68 65  -03996-12088 The
12b20 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73   M parameter mus
12b30 74 20 62 65 20 61 20 76 61 6c 69 64 20 63 68 65  t be a valid che
12b40 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d  ckpoint.    ** m
12b50 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75  ode: */.    retu
12b60 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
12b70 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
12b80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
12b90 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
12ba0 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
12bb0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
12bc0 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
12bd0 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
12be0 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
12bf0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
12c00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12c10 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
12c20 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
12c30 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
12c40 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
12c50 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  .    db->busyHan
12c60 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
12c70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12c80 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69  Checkpoint(db, i
12c90 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Db, eMode, pnLog
12ca0 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73  , pnCkpt);.    s
12cb0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
12cc0 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  rc);.  }.  rc = 
12cd0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
12ce0 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  b, rc);..  /* If
12cf0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63   there are no ac
12d00 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2c  tive statements,
12d10 20 63 6c 65 61 72 20 74 68 65 20 69 6e 74 65 72   clear the inter
12d20 72 75 70 74 20 66 6c 61 67 20 61 74 20 74 68 69  rupt flag at thi
12d30 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a  s.  ** point.  *
12d40 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62  /.  if( db->nVdb
12d50 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20  eActive==0 ){.  
12d60 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
12d70 72 75 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  rupted = 0;.  }.
12d80 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12d90 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
12da0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12db0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
12dc0 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
12dd0 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62  base zDb. If zDb
12de0 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20   is NULL, or if 
12df0 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70  the buffer zDb p
12e00 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74  oints.** to cont
12e10 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  ains a zero-leng
12e20 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61  th string, all a
12e30 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
12e40 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70  s are .** checkp
12e50 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ointed..*/.int s
12e60 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
12e70 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
12e80 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
12e90 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Db){.  /* EVIDEN
12ea0 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32  CE-OF: R-41613-2
12eb0 30 35 35 33 20 54 68 65 20 73 71 6c 69 74 65 33  0553 The sqlite3
12ec0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
12ed0 44 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c 65  D,X) is equivale
12ee0 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74  nt to.  ** sqlit
12ef0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
12f00 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f  t_v2(D,X,SQLITE_
12f10 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
12f20 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65  VE,0,0). */.  re
12f30 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  turn sqlite3_wal
12f40 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
12f50 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45  b,zDb,SQLITE_CHE
12f60 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
12f70 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  0,0);.}..#ifndef
12f80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
12f90 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65  ./*.** Run a che
12fa0 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62  ckpoint on datab
12fb0 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73  ase iDb. This is
12fc0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61   a no-op if data
12fd0 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e  base iDb is.** n
12fe0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ot currently ope
12ff0 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a  n in WAL mode..*
13000 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
13010 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
13020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
13030 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
13040 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
13050 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
13060 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20  TE_LOCKED and a 
13070 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f  checkpoint is no
13080 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20  t attempted. If 
13090 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  .** an error occ
130a0 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e  urs while runnin
130b0 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  g the checkpoint
130c0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
130d0 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
130e0 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c  turned (i.e. SQL
130f0 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65  ITE_IOERR). Othe
13100 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
13110 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
13120 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  x on database ha
13130 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62  ndle db should b
13140 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61  e held by the ca
13150 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a  ller. The mutex.
13160 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
13170 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20  th the specific 
13180 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65  b-tree being che
13190 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b  ckpointed is tak
131a0 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75  en by.** this fu
131b0 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65  nction while the
131c0 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72   checkpoint is r
131d0 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  unning..**.** If
131e0 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53   iDb is passed S
131f0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13200 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74  ED, then all att
13210 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
13220 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  are.** checkpoin
13230 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ted. If an error
13240 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
13250 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  it is returned i
13260 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20  mmediately -.** 
13270 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  no attempt is ma
13280 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  de to checkpoint
13290 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64   any remaining d
132a0 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
132b0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
132c0 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  is one of SQLITE
132d0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
132e0 49 56 45 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41  IVE, FULL, RESTA
132f0 52 54 0a 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54  RT.** or TRUNCAT
13300 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
13310 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  3Checkpoint(sqli
13320 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
13330 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74  , int eMode, int
13340 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e   *pnLog, int *pn
13350 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Ckpt){.  int rc 
13360 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
13370 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13380 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
13390 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
133b0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
133c0 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64  through attached
133d0 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42   dbs */.  int bB
133e0 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  usy = 0;        
133f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13400 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  e if SQLITE_BUSY
13410 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e   has been encoun
13420 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  tered */..  asse
13430 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13440 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
13450 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
13460 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d  pnLog || *pnLog=
13470 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =-1 );.  assert(
13480 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43   !pnCkpt || *pnC
13490 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f  kpt==-1 );..  fo
134a0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
134b0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
134c0 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  K; i++){.    if(
134d0 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d   i==iDb || iDb==
134e0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
134f0 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  HED ){.      rc 
13500 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68  = sqlite3BtreeCh
13510 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62  eckpoint(db->aDb
13520 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20  [i].pBt, eMode, 
13530 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
13540 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b        pnLog = 0;
13550 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20  .      pnCkpt = 
13560 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  0;.      if( rc=
13570 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
13580 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20          bBusy = 
13590 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
135a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
135b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
135c0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
135d0 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20  TE_OK && bBusy) 
135e0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
135f0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
13600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
13610 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
13620 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
13630 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d  true if main-mem
13640 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ory should be us
13650 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
13660 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
13670 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20  e for transient 
13680 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20  pager files and 
13690 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
136a0 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ls..** The value
136b0 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64   returned depend
136c0 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
136d0 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  f db->temp_store
136e0 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72   (runtime.** par
136f0 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20  ameter) and the 
13700 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c  compile time val
13710 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d  ue of SQLITE_TEM
13720 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20  P_STORE. The.** 
13730 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
13740 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65  describes the re
13750 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
13760 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c  en these two val
13770 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20  ues.** and this 
13780 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
13790 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   value..**.**   
137a0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
137b0 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73  E     db->temp_s
137c0 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f  tore     Locatio
137d0 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64  n of temporary d
137e0 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d  atabase.**   ---
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
13800 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
13810 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13830 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
13860 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
13870 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13890 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
138a0 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
138b0 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
138c0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
138d0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
138e0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
138f0 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
13900 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
13910 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
13920 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
13930 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
13940 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
13950 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
13970 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
13980 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
139c0 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20  urn 1).**   2   
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
139f0 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
13a00 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33  return 1).**   3
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
13a30 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
13a40 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a    (return 1).*/.
13a50 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49  int sqlite3TempI
13a60 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71  nMemory(const sq
13a70 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20  lite3 *db){.#if 
13a80 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
13a90 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20  E==1.  return ( 
13aa0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d  db->temp_store==
13ab0 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  2 );.#endif.#if 
13ac0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
13ad0 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20  E==2.  return ( 
13ae0 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d  db->temp_store!=
13af0 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1 );.#endif.#if 
13b00 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
13b10 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41  E==3.  UNUSED_PA
13b20 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72  RAMETER(db);.  r
13b30 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
13b40 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
13b50 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54  STORE<1 || SQLIT
13b60 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20  E_TEMP_STORE>3. 
13b70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13b80 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(db);.  return 
13b90 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
13ba0 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
13bb0 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
13bc0 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
13bd0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
13be0 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
13bf0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
13c00 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
13c10 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
13c20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
13c30 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
13c40 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
13c50 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
13c60 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69  M_BKPT);.  }.  i
13c70 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
13c80 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
13c90 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
13ca0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
13cb0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
13cc0 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  T);.  }.  sqlite
13cd0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
13ce0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
13cf0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13d00 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69   ){.    z = sqli
13d10 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
13d20 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
13d30 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63  }else{.    testc
13d40 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30  ase( db->pErr==0
13d50 20 29 3b 0a 20 20 20 20 7a 20 3d 20 64 62 2d 3e   );.    z = db->
13d60 65 72 72 43 6f 64 65 20 3f 20 28 63 68 61 72 2a  errCode ? (char*
13d70 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
13d80 65 78 74 28 64 62 2d 3e 70 45 72 72 29 20 3a 20  ext(db->pErr) : 
13d90 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
13da0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13db0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30   );.    if( z==0
13dc0 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
13dd0 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
13de0 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  errCode);.    }.
13df0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
13e00 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
13e10 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
13e20 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
13e30 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
13e40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
13e50 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  16 encoded Engli
13e60 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
13e70 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
13e80 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
13e90 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  ror..*/.const vo
13ea0 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  id *sqlite3_errm
13eb0 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62  sg16(sqlite3 *db
13ec0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
13ed0 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d  t u16 outOfMem[]
13ee0 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75   = {.    'o', 'u
13ef0 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27  ', 't', ' ', 'o'
13f00 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c  , 'f', ' ', 'm',
13f10 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20   'e', 'm', 'o', 
13f20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b  'r', 'y', 0.  };
13f30 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
13f40 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b  u16 misuse[] = {
13f50 0a 20 20 20 20 27 62 27 2c 20 27 61 27 2c 20 27  .    'b', 'a', '
13f60 64 27 2c 20 27 20 27 2c 20 27 70 27 2c 20 27 61  d', ' ', 'p', 'a
13f70 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 6d 27  ', 'r', 'a', 'm'
13f80 2c 20 27 65 27 2c 20 27 74 27 2c 20 27 65 27 2c  , 'e', 't', 'e',
13f90 20 27 72 27 2c 20 27 20 27 2c 0a 20 20 20 20 27   'r', ' ',.    '
13fa0 6f 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 6f  o', 'r', ' ', 'o
13fb0 27 2c 20 27 74 27 2c 20 27 68 27 2c 20 27 65 27  ', 't', 'h', 'e'
13fc0 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 41 27 2c  , 'r', ' ', 'A',
13fd0 20 27 50 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a   'P', 'I', ' ',.
13fe0 20 20 20 20 27 6d 27 2c 20 27 69 27 2c 20 27 73      'm', 'i', 's
13ff0 27 2c 20 27 75 27 2c 20 27 73 27 2c 20 27 65 27  ', 'u', 's', 'e'
14000 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
14010 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
14020 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
14030 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66  rn (void *)outOf
14040 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Mem;.  }.  if( !
14050 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
14060 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
14070 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
14080 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d  id *)misuse;.  }
14090 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
140a0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
140b0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
140c0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
140d0 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74   z = (void *)out
140e0 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OfMem;.  }else{.
140f0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
14100 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
14110 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  >pErr);.    if( 
14120 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
14130 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
14140 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64  g(db, db->errCod
14150 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  e, sqlite3ErrStr
14160 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a  (db->errCode));.
14170 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
14180 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
14190 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a  b->pErr);.    }.
141a0 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28      /* A malloc(
141b0 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65  ) may have faile
141c0 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
141d0 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c  l to sqlite3_val
141e0 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20  ue_text16().    
141f0 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69  ** above. If thi
14200 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
14210 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  hen the db->mall
14220 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65  ocFailed flag ne
14230 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
14240 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
14250 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
14260 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
14270 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20  tead of via.    
14280 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  ** sqlite3ApiExi
14290 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65  t(), to avoid se
142a0 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  tting the databa
142b0 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20  se handle error 
142c0 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  message..    */.
142d0 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c      sqlite3OomCl
142e0 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73  ear(db);.  }.  s
142f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14300 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
14310 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
14320 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14330 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
14340 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
14350 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
14360 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
14370 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
14380 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
14390 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
143a0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
143b0 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
143c0 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
143d0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
143e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
143f0 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
14400 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
14410 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
14420 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
14430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14440 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
14450 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
14460 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
14470 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
14480 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
14490 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
144a0 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20  n db->errCode & 
144b0 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69  db->errMask;.}.i
144c0 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
144d0 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69  ded_errcode(sqli
144e0 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
144f0 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61  db && !sqlite3Sa
14500 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
14510 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
14520 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
14530 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  E_BKPT;.  }.  if
14540 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
14550 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14570 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
14580 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
14590 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ode;.}.int sqlit
145a0 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28  e3_system_errno(
145b0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
145c0 72 65 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e  return db ? db->
145d0 69 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d  iSysErrno : 0;.}
145e0 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e    ../*.** Return
145f0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
14600 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e  escribes the kin
14610 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69  d of error speci
14620 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61  fied in the.** a
14630 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f  rgument.  For no
14640 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63  w, this simply c
14650 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61  alls the interna
14660 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  l sqlite3ErrStr(
14670 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ).** function..*
14680 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
14690 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74  lite3_errstr(int
146a0 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   rc){.  return s
146b0 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
146c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
146d0 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e  e a new collatin
146e0 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  g function for d
146f0 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54  atabase "db".  T
14700 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65  he name is zName
14710 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f  .** and the enco
14720 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a  ding is enc..*/.
14730 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
14740 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  eCollation(.  sq
14750 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e  lite3* db,.  con
14760 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
14770 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69  .  u8 enc,.  voi
14780 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
14790 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
147a0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
147b0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
147c0 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
147d0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c  void*).){.  Coll
147e0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
147f0 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73  t enc2;.  .  ass
14800 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14810 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
14820 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  x) );..  /* If S
14830 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
14840 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
14850 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
14860 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
14870 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
14880 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
14890 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
148a0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
148b0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
148c0 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
148d0 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
148e0 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
148f0 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20  .  enc2 = enc;. 
14900 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
14910 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b  =SQLITE_UTF16 );
14920 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
14930 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
14940 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28  ALIGNED );.  if(
14950 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
14960 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c  F16 || enc2==SQL
14970 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
14980 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20  D ){.    enc2 = 
14990 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
149a0 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e  VE;.  }.  if( en
149b0 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c2<SQLITE_UTF8 |
149c0 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54  | enc2>SQLITE_UT
149d0 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74  F16BE ){.    ret
149e0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
149f0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BKPT;.  }..  /
14a00 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
14a10 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67  call is removing
14a20 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e   or replacing an
14a30 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74   existing collat
14a40 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ion .  ** sequen
14a50 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74  ce. If so, and t
14a60 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
14a70 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79  VMs, return busy
14a80 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  . If there.  ** 
14a90 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
14aa0 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  s, invalidate an
14ab0 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  y pre-compiled s
14ac0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
14ad0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
14ae0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
14af0 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
14b00 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 0);.  if( pCol
14b10 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
14b20 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
14b30 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20  nVdbeActive ){. 
14b40 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14b50 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
14b60 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
14b70 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
14b80 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c  lete/modify coll
14b90 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64  ation sequence d
14ba0 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
14bb0 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
14bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
14bd0 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
14be0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
14bf0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
14c00 62 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  b, 0);..    /* I
14c10 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
14c20 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
14c30 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
14c40 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
14c50 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
14c60 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
14c70 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
14c80 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
14c90 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
14ca0 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
14cb0 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
14cc0 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
14cd0 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
14ce0 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
14cf0 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
14d00 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
14d10 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
14d20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
14d30 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
14d40 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
14d50 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
14d60 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
14d70 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
14d80 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
14d90 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
14da0 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b  CollSeq, zName);
14db0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
14dc0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
14dd0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
14de0 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
14df0 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
14e00 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
14e10 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
14e20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
14e30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14e40 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
14e50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14e60 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
14e70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
14e80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14e90 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
14ea0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
14eb0 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
14ec0 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
14ed0 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
14ee0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14ef0 54 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  T;.  pColl->xCmp
14f00 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70   = xCompare;.  p
14f10 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43  Coll->pUser = pC
14f20 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65  tx;.  pColl->xDe
14f30 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c  l = xDel;.  pCol
14f40 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e  l->enc = (u8)(en
14f50 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49  c2 | (enc & SQLI
14f60 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
14f70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  ));.  sqlite3Err
14f80 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
14f90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14fa0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
14fb0 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
14fc0 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
14fd0 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
14fe0 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
14ff0 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
15000 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
15010 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
15020 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
15030 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
15040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
15050 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
15060 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
15070 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
15080 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
15090 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
150a0 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
150b0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
150c0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
150d0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
150e0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
150f0 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
15100 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
15110 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
15120 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
15130 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
15140 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
15150 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
15160 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a  _NUMBER,      /*
15170 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32   IMP: R-38091-32
15180 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f  352 */.  SQLITE_
15190 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
151a0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
151b0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a  WORKER_THREADS,.
151c0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
151d0 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d  ure the hard lim
151e0 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72  its are set to r
151f0 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73  easonable values
15200 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
15210 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  AX_LENGTH<100.# 
15220 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
15230 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
15240 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
15250 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15260 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30  AX_SQL_LENGTH<10
15270 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
15280 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
15290 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
152a0 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
152b0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
152c0 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58  ENGTH>SQLITE_MAX
152d0 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20  _LENGTH.# error 
152e0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
152f0 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62  ENGTH must not b
15300 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  e greater than S
15310 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
15320 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
15330 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
15340 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72  SELECT<2.# error
15350 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
15360 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74  OUND_SELECT must
15370 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23   be at least 2.#
15380 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
15390 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a  _MAX_VDBE_OP<40.
153a0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
153b0 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20  AX_VDBE_OP must 
153c0 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23  be at least 40.#
153d0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
153e0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
153f0 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  G<0 || SQLITE_MA
15400 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31  X_FUNCTION_ARG>1
15410 32 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  27.# error SQLIT
15420 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
15430 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  RG must be betwe
15440 65 6e 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e  en 0 and 127.#en
15450 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
15460 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c  AX_ATTACHED<0 ||
15470 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
15480 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72  CHED>125.# error
15490 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
154a0 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74  CHED must be bet
154b0 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23  ween 0 and 125.#
154c0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
154d0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
154e0 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72  N_LENGTH<1.# err
154f0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  or SQLITE_MAX_LI
15500 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
15510 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
15520 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
15530 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
15540 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20  N>32767.# error 
15550 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
15560 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65  N must not excee
15570 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23  d 32767.#endif.#
15580 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  if SQLITE_MAX_TR
15590 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20  IGGER_DEPTH<1.# 
155a0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
155b0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d  _TRIGGER_DEPTH m
155c0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
155d0 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
155e0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
155f0 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49  HREADS<0 || SQLI
15600 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
15610 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72  READS>50.# error
15620 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
15630 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20  ER_THREADS must 
15640 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
15650 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   50.#endif.../*.
15660 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
15670 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20  lue of a limit. 
15680 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   Report the old 
15690 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20  value..** If an 
156a0 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e  invalid limit in
156b0 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c  dex is supplied,
156c0 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d   report -1..** M
156d0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62  ake no changes b
156e0 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20  ut still report 
156f0 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66  the old value if
15700 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69   the.** new limi
15710 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a  t is negative..*
15720 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72  *.** A new lower
15730 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20   limit does not 
15740 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20  shrink existing 
15750 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49  constructs..** I
15760 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74  t merely prevent
15770 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73  s new constructs
15780 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65   that exceed the
15790 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66   limit.** from f
157a0 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  orming..*/.int s
157b0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c  qlite3_limit(sql
157c0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69  ite3 *db, int li
157d0 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69  mitId, int newLi
157e0 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c  mit){.  int oldL
157f0 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  imit;..#ifdef SQ
15800 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
15810 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
15820 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
15830 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
15840 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
15850 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
15860 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n -1;.  }.#endif
15870 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
15880 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
15890 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
158a0 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
158b0 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
158c0 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
158d0 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
158e0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
158f0 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
15900 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
15910 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
15920 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
15930 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
15940 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
15950 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
15960 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
15970 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15980 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
15990 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
159a0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
159b0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
159c0 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
159d0 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
159e0 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
159f0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15a00 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
15a10 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
15a20 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
15a30 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15a40 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
15a50 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
15a60 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
15a70 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
15a80 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15a90 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
15aa0 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
15ab0 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
15ac0 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
15ad0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
15ae0 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
15af0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
15b00 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
15b10 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15b20 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
15b30 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
15b40 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
15b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15b60 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15b70 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
15b80 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
15b90 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
15ba0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
15bb0 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
15bc0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
15bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
15c10 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
15c20 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15c30 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15c40 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
15c50 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
15c60 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
15c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15c80 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15c90 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
15ca0 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
15cb0 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
15cc0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15cd0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15ce0 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
15cf0 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57  S]==SQLITE_MAX_W
15d00 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b  ORKER_THREADS );
15d10 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
15d20 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
15d30 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f  HREADS==(SQLITE_
15d40 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
15d50 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
15d60 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
15d70 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
15d80 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
15d90 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
15da0 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
15db0 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
15dc0 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
15dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
15de0 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
15df0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
15e00 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
15e10 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
15e20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
15e30 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
15e40 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
15e50 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
15e60 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
15e70 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
15e80 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
15e90 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
15ec0 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  35419 */.}../*.*
15ed0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15ee0 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65  is used to parse
15ef0 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e   both URIs and n
15f00 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73  on-URI filenames
15f10 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a   passed by the.*
15f20 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75  * user to API fu
15f30 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
15f40 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65  open() or sqlite
15f50 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64  3_open_v2(), and
15f60 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a   for database.**
15f70 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20   URIs specified 
15f80 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43  as part of ATTAC
15f90 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  H statements..**
15fa0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
15fb0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
15fc0 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
15fd0 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
15fe0 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e  o use (or.** a N
15ff0 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  ULL to signify t
16000 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20  he default VFS) 
16010 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20  if the URI does 
16020 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76  not contain a "v
16030 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79  fs=xxx".** query
16040 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20   parameter. The 
16050 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
16060 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49  contains the URI
16070 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   (or non-URI fil
16080 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66  ename).** itself
16090 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
160a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
160b0 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61  he *pFlags varia
160c0 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ble should conta
160d0 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  in.** the defaul
160e0 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  t flags to open 
160f0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
16100 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61  dle with. The va
16110 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
16120 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20   *pFlags may be 
16130 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72  updated before r
16140 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20  eturning if the 
16150 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e  URI filename con
16160 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65  tains .** "cache
16170 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78  =xxx" or "mode=x
16180 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  xx" query parame
16190 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ters..**.** If s
161a0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
161b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
161c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a  . In this case *
161d0 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20  ppVfs is set to 
161e0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
161f0 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20  VFS that should 
16200 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  be used to open 
16210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16220 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65  e. *pzFile is se
16230 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
16240 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
16250 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
16260 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65   the file to ope
16270 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
16280 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
16290 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
162a0 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
162b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
162c0 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  to release.** th
162d0 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  is buffer..**.**
162e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
162f0 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  urs, then an SQL
16300 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
16310 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
16320 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20  pzErrMsg.** may 
16330 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
16340 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
16350 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73  aining an Englis
16360 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
16370 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74   .** message. It
16380 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
16390 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
163a0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
163b0 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ly release.** th
163c0 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c  is buffer by cal
163d0 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  ling sqlite3_fre
163e0 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
163f0 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63  te3ParseUri(.  c
16400 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
16410 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f  ultVfs,        /
16420 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20  * VFS to use if 
16430 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65  no "vfs=xxx" que
16440 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63  ry option */.  c
16450 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c  onst char *zUri,
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16470 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
16480 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f   URI to parse */
16490 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
164a0 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
164b0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51     /* IN/OUT: SQ
164c0 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
164d0 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
164e0 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20  _vfs **ppVfs,   
164f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16500 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a   VFS to use */ .
16510 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c    char **pzFile,
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61    /* OUT: Filena
16540 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  me component of 
16550 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  URI */.  char **
16560 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
16570 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16580 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
16590 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
165a0 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
165b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
165c0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
165d0 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20  gs = *pFlags;.  
165e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
165f0 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a   = zDefaultVfs;.
16600 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
16610 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e   char c;.  int n
16620 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Uri = sqlite3Str
16630 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20  len30(zUri);..  
16640 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73  assert( *pzErrMs
16650 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  g==0 );..  if( (
16660 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
16670 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20  OPEN_URI)       
16680 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
16690 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20  48725-32206 */. 
166a0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
166b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
166c0 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49  g.bOpenUri) /* I
166d0 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34  MP: R-51689-4654
166e0 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e  8 */.   && nUri>
166f0 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72  =5 && memcmp(zUr
16700 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d  i, "file:", 5)==
16710 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38  0 /* IMP: R-5788
16720 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a  4-37496 */.  ){.
16730 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a      char *zOpt;.
16740 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20      int eState; 
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16760 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74    /* Parser stat
16770 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55  e when parsing U
16780 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  RI */.    int iI
16790 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
167a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
167b0 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
167c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74   */.    int iOut
167d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
167e0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
167f0 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
16800 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65  */.    u64 nByte
16810 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20   = nUri+2;      
16820 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
16830 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
16840 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  te */..    /* Ma
16850 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49  ke sure the SQLI
16860 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67  TE_OPEN_URI flag
16870 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63   is set to indic
16880 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78  ate to the VFS x
16890 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74  Open .    ** met
168a0 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d  hod that there m
168b0 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61  ay be extra para
168c0 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67  meters following
168d0 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20   the file-name. 
168e0 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   */.    flags |=
168f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
16900 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30  ;..    for(iIn=0
16910 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b  ; iIn<nUri; iIn+
16920 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72  +) nByte += (zUr
16930 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20  i[iIn]=='&');.  
16940 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
16950 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
16960 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
16970 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
16980 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20  E_NOMEM_BKPT;.. 
16990 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64     iIn = 5;.#ifd
169a0 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f  ef SQLITE_ALLOW_
169b0 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20  URI_AUTHORITY.  
169c0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55    if( strncmp(zU
169d0 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d  ri+5, "///", 3)=
169e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  =0 ){.      iIn 
169f0 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  = 7;.      /* Th
16a00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64  e following cond
16a10 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49  ition causes URI
16a20 73 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64  s with five lead
16a30 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73  ing / characters
16a40 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66  .      ** like f
16a50 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61  ile://///host/pa
16a60 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74  th to be convert
16a70 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b  ed into UNCs lik
16a80 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20  e //host/path.. 
16a90 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72       ** The corr
16aa0 65 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74  ect URI for that
16ab0 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77   UNC has only tw
16ac0 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e  o or four leadin
16ad0 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
16ae0 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68       ** file://h
16af0 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65  ost/path or file
16b00 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20  :////host/path. 
16b10 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73   But 5 leading s
16b20 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20  lashes is a .   
16b30 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72     ** common err
16b40 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c  or, we are told,
16b50 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74   so we handle it
16b60 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
16b70 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  se. */.      if(
16b80 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c   strncmp(zUri+7,
16b90 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b   "///", 3)==0 ){
16ba0 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65   iIn++; }.    }e
16bb0 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
16bc0 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c  zUri+5, "//local
16bd0 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29  host/", 12)==0 )
16be0 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36  {.      iIn = 16
16bf0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
16c00 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
16c10 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68   scheme and auth
16c20 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f  ority segments o
16c30 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20  f the URI. */.  
16c40 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27    if( zUri[5]=='
16c50 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27  /' && zUri[6]=='
16c60 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  /' ){.      iIn 
16c70 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 7;.      while
16c80 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
16c90 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20  Uri[iIn]!='/' ) 
16ca0 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
16cb0 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21   iIn!=7 && (iIn!
16cc0 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c  =16 || memcmp("l
16cd0 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69  ocalhost", &zUri
16ce0 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20  [7], 9)) ){.    
16cf0 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
16d00 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16d10 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74  "invalid uri aut
16d20 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a  hority: %.*s", .
16d30 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d              iIn-
16d40 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20  7, &zUri[7]);.  
16d50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16d60 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
16d70 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
16d80 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
16d90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
16da0 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e  * Copy the filen
16db0 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72  ame and any quer
16dc0 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74  y parameters int
16dd0 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66  o the zFile buff
16de0 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f  er. .    ** Deco
16df0 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f  de %HH escape co
16e00 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  des along the wa
16e10 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  y. .    **.    *
16e20 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  * Within this lo
16e30 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74  op, variable eSt
16e40 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ate may be set t
16e50 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70  o 0, 1 or 2, dep
16e60 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  ending.    ** on
16e70 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
16e80 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  text. As follows
16e90 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
16ea0 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c    0: Parsing fil
16eb0 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20  e-name..    **  
16ec0 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65   1: Parsing name
16ed0 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
16ee0 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
16ef0 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a  arameter..    **
16f00 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61     2: Parsing va
16f10 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  lue section of a
16f20 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
16f30 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
16f40 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d   */.    eState =
16f50 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
16f60 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
16f70 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20  0 && c!='#' ){. 
16f80 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
16f90 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20    if( c=='%' .  
16fa0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
16fb0 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
16fc0 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  ]) .       && sq
16fd0 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
16fe0 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20  ri[iIn+1]) .    
16ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
17000 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65   octet = (sqlite
17010 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
17020 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20  In++]) << 4);.  
17030 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73        octet += s
17040 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
17050 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20  Uri[iIn++]);..  
17060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
17070 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c  tet>=0 && octet<
17080 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  256 );.        i
17090 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23  f( octet==0 ){.#
170a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
170b0 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f  ABLE_URI_00_ERRO
170c0 52 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  R.          /* T
170d0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
170e0 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61  ken when "%00" a
170f0 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68  ppears within th
17100 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20  e URI. In this. 
17110 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
17120 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74   we ignore all t
17130 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ext in the remai
17140 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68  nder of the path
17150 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20  , name or.      
17160 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72      ** value cur
17170 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72  rently being par
17180 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  sed. So ignore t
17190 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
171a0 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  cter.          *
171b0 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68  * and skip to th
171c0 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20  e next "?", "=" 
171d0 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f  or "&", as appro
171e0 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  priate. */.     
171f0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
17200 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
17210 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20  & c!='#' .      
17220 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
17230 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29  te!=0 || c!='?')
17240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
17250 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20  & (eState!=1 || 
17260 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26  (c!='=' && c!='&
17270 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')).            
17280 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20    && (eState!=2 
17290 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20  || c!='&').     
172a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
172b0 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
172c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
172d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65   continue;.#else
172e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
172f0 20 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45   ENABLE_URI_00_E
17300 52 52 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c  RROR is defined,
17310 20 22 25 30 30 22 20 69 6e 20 61 20 55 52 49 20   "%00" in a URI 
17320 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a  is an error. */.
17330 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
17340 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
17350 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65  rintf("unexpecte
17360 64 20 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b  d %%00 in uri");
17370 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17380 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17390 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
173a0 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64  se_uri_out;.#end
173b0 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
173c0 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
173d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
173e0 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
173f0 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
17400 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
17410 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
17420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
17430 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
17440 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
17450 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
17460 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
17470 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
17480 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
17490 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
174a0 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
174b0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
174c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
174d0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
174e0 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
174f0 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
17500 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
17510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
17520 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
17530 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
17540 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
17550 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
17560 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
17570 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
17580 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
17590 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
175a0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
175b0 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
175c0 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
175d0 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
175e0 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
175f0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
17600 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
17610 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
17620 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
17630 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
17640 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
17650 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
17660 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
17670 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
17680 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
17690 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
176a0 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
176b0 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
176c0 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
176d0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
176e0 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
176f0 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
17700 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
17710 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
17720 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
17730 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
17740 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
17750 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
17760 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
17770 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
17780 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
17790 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
177a0 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
177b0 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
177c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
177d0 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
177e0 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
177f0 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
17800 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
17810 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
17820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17830 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
17840 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
17850 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
17860 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
17870 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
17880 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
17890 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
178a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
178b0 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
178c0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
178d0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
178e0 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
178f0 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
17900 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
17910 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
17920 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
17930 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
17940 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
17950 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
17960 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
17970 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
17980 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
17990 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
179a0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
179b0 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
179c0 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
179d0 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
179e0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
179f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
17a00 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
17a10 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
17a20 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
17a30 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
17a40 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
17a50 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
17a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17a70 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
17a80 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
17a90 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
17aa0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
17ab0 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
17ac0 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
17ad0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
17ae0 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
17af0 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
17b00 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
17b10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17b20 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
17b30 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
17b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17b50 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
17b60 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
17b70 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d            { "mem
17b80 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ory", SQLITE_OPE
17b90 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20  N_MEMORY },.    
17ba0 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
17bb0 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
17bc0 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
17bd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17be0 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50  ONLY | SQLITE_OP
17bf0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  EN_READWRITE.   
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
17c20 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
17c30 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20  EN_MEMORY;.     
17c40 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70       aMode = aOp
17c50 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  enMode;.        
17c60 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26    limit = mask &
17c70 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
17c80 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61    zModeType = "a
17c90 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20  ccess";.        
17ca0 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  }..        if( a
17cb0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
17cc0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
17cd0 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b     int mode = 0;
17ce0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
17cf0 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20  =0; aMode[i].z; 
17d00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
17d10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
17d20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20  = aMode[i].z;.  
17d30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56            if( nV
17d40 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  al==sqlite3Strle
17d50 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d  n30(z) && 0==mem
17d60 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61  cmp(zVal, z, nVa
17d70 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
17d80 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65      mode = aMode
17d90 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  [i].mode;.      
17da0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17db0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17dd0 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29     if( mode==0 )
17de0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
17df0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
17e00 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
17e10 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c  ch %s mode: %s",
17e20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
17e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
17e40 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
17e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
17e60 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
17e70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17e80 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64          if( (mod
17e90 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  e & ~SQLITE_OPEN
17ea0 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29  _MEMORY)>limit )
17eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
17ec0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
17ed0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
17ee0 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
17ef0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
17f20 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
17f30 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
17f40 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
17f50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
17f60 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
17f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17f80 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
17f90 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
17fa0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
17fb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
17fc0 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
17fd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
17fe0 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
17ff0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
18000 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20  Uri+2);.    if( 
18010 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
18020 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18030 54 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  T;.    if( nUri 
18040 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
18050 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72  zFile, zUri, nUr
18060 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  i);.    }.    zF
18070 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27  ile[nUri] = '\0'
18080 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
18090 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
180a0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
180b0 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a  _OPEN_URI;.  }..
180c0 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74    *ppVfs = sqlit
180d0 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73  e3_vfs_find(zVfs
180e0 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d  );.  if( *ppVfs=
180f0 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  =0 ){.    *pzErr
18100 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
18110 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76  rintf("no such v
18120 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a  fs: %s", zVfs);.
18130 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18140 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73  ERROR;.  }. pars
18150 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28  e_uri_out:.  if(
18160 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18170 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
18180 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a  ee(zFile);.    z
18190 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
181a0 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  *pFlags = flags;
181b0 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69  .  *pzFile = zFi
181c0 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  le;.  return rc;
181d0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
181e0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
181f0 29 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  )./*.** Process 
18200 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 71 75 65  URI filename que
18210 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 72 65  ry parameters re
18220 6c 65 76 61 6e 74 20 74 6f 20 74 68 65 20 53 51  levant to the SQ
18230 4c 69 74 65 20 45 6e 63 72 79 70 74 69 6f 6e 0a  Lite Encryption.
18240 2a 2a 20 45 78 74 65 6e 73 69 6f 6e 2e 20 20 52  ** Extension.  R
18250 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
18260 79 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e  y of the relevan
18270 74 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  t query paramete
18280 72 73 20 61 72 65 0a 2a 2a 20 73 65 65 6e 20 61  rs are.** seen a
18290 6e 64 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20  nd return false 
182a0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73  if not..*/.int s
182b0 71 6c 69 74 65 33 43 6f 64 65 63 51 75 65 72 79  qlite3CodecQuery
182c0 50 61 72 61 6d 65 74 65 72 73 28 0a 20 20 73 71  Parameters(.  sq
182d0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
182e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
182f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
18300 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
18310 2c 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ,       /* Which
18320 20 73 63 68 65 6d 61 20 69 73 20 62 65 69 6e 67   schema is being
18330 20 63 72 65 61 74 65 64 2f 61 74 74 61 63 68 65   created/attache
18340 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
18350 72 20 2a 7a 55 72 69 20 20 20 20 20 20 20 2f 2a  r *zUri       /*
18360 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 2a 2f   URI filename */
18370 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
18380 20 2a 7a 4b 65 79 3b 0a 20 20 69 66 28 20 28 7a   *zKey;.  if( (z
18390 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  Key = sqlite3_ur
183a0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 55 72 69  i_parameter(zUri
183b0 2c 20 22 68 65 78 6b 65 79 22 29 29 21 3d 30 20  , "hexkey"))!=0 
183c0 26 26 20 7a 4b 65 79 5b 30 5d 20 29 7b 0a 20 20  && zKey[0] ){.  
183d0 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20    u8 iByte;.    
183e0 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
183f0 7a 44 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20  zDecoded[40];.  
18400 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65    for(i=0, iByte
18410 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65  =0; i<sizeof(zDe
18420 63 6f 64 65 64 29 2a 32 20 26 26 20 73 71 6c 69  coded)*2 && sqli
18430 74 65 33 49 73 78 64 69 67 69 74 28 7a 4b 65 79  te3Isxdigit(zKey
18440 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [i]); i++){.    
18450 20 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65    iByte = (iByte
18460 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65  <<4) + sqlite3He
18470 78 54 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b  xToInt(zKey[i]);
18480 0a 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29  .      if( (i&1)
18490 21 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b 69  !=0 ) zDecoded[i
184a0 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20  /2] = iByte;.   
184b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b   }.    sqlite3_k
184c0 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a  ey_v2(db, zDb, z
184d0 44 65 63 6f 64 65 64 2c 20 69 2f 32 29 3b 0a 20  Decoded, i/2);. 
184e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
184f0 65 6c 73 65 20 69 66 28 20 28 7a 4b 65 79 20 3d  else if( (zKey =
18500 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
18510 61 6d 65 74 65 72 28 7a 55 72 69 2c 20 22 6b 65  ameter(zUri, "ke
18520 79 22 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  y"))!=0 ){.    s
18530 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
18540 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 73 71 6c  , zDb, zKey, sql
18550 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4b 65  ite3Strlen30(zKe
18560 79 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  y));.    return 
18570 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  1;.  }else if( (
18580 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75  zKey = sqlite3_u
18590 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 55 72  ri_parameter(zUr
185a0 69 2c 20 22 74 65 78 74 6b 65 79 22 29 29 21 3d  i, "textkey"))!=
185b0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
185c0 5f 6b 65 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c  _key_v2(db, zDb,
185d0 20 7a 4b 65 79 2c 20 2d 31 29 3b 0a 20 20 20 20   zKey, -1);.    
185e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
185f0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
18600 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
18610 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18620 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  ne does the work
18630 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61   of opening a da
18640 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66  tabase on behalf
18650 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   of.** sqlite3_o
18660 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65  pen() and sqlite
18670 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20  3_open16(). The 
18680 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
18690 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a  e "zFilename"  .
186a0 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f  ** is UTF-8 enco
186b0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
186c0 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  nt openDatabase(
186d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
186e0 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74  Filename, /* Dat
186f0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55  abase filename U
18700 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a  TF-8 encoded */.
18710 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
18720 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  ,        /* OUT:
18730 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61   Returned databa
18740 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75  se handle */.  u
18750 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
18760 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69  s,    /* Operati
18770 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20  onal flags */.  
18780 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
18790 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
187a0 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
187b0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
187c0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
187d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
187e0 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64  e allocated hand
187f0 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
18800 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18820 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
18830 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66   int isThreadsaf
18840 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18850 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72   /* True for thr
18860 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69  eadsafe connecti
18870 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
18880 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Open = 0;       
18890 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
188a0 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  name argument to
188b0 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70   pass to BtreeOp
188c0 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  en() */.  char *
188d0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
188e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
188f0 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
18900 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
18910 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
18920 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
18930 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d  RMOR.  if( ppDb=
18940 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18950 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
18960 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
18970 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
18980 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
18990 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
189a0 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
189b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
189c0 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  rc;.#endif..  if
189d0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
189e0 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
189f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
18a00 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
18a10 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
18a20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
18a30 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
18a40 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
18a50 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
18a60 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
18a70 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
18a80 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
18a90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
18aa0 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
18ab0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18ac0 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
18ad0 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
18ae0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
18af0 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20  ATECACHE ){.    
18b00 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
18b10 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
18b20 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  E;.  }else if( s
18b30 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18b40 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
18b50 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61  abled ){.    fla
18b60 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
18b70 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
18b80 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
18b90 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
18ba0 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
18bb0 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
18bc0 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
18bd0 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
18be0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
18bf0 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
18c00 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
18c10 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
18c20 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
18c30 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
18c40 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
18c50 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
18c60 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
18c70 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
18c80 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
18c90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
18ca0 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ITE, SQLITE_OPEN
18cb0 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f  _CREATE, SQLITE_
18cc0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
18cd0 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
18ce0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c  EN_PRIVATECACHE,
18cf0 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76   and some reserv
18d00 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74  ed bits.  Silent
18d10 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66  ly mask.  ** off
18d20 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
18d30 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26  ..  */.  flags &
18d40 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45  =  ~( SQLITE_OPE
18d50 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
18d60 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
18d70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
18d80 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
18d90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18da0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20  PEN_MAIN_DB |.  
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18dc0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
18dd0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
18de0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
18df0 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20  RANSIENT_DB | . 
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18e10 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
18e20 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
18e30 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18e40 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
18e50 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
18e60 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
18e70 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  SUBJOURNAL | .  
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18e90 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
18ea0 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20  JOURNAL |.      
18eb0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18ec0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20  OPEN_NOMUTEX |. 
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18ee0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
18ef0 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
18f00 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18f10 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  _WAL.           
18f20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    );..  /* Alloc
18f30 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
18f40 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
18f50 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d  .  db = sqlite3M
18f60 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
18f70 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20  f(sqlite3) );.  
18f80 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f  if( db==0 ) goto
18f90 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69   opendb_out;.  i
18fa0 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20  f( isThreadsafe 
18fb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18fc0 4e 41 42 4c 45 5f 4d 55 4c 54 49 54 48 52 45 41  NABLE_MULTITHREA
18fd0 44 45 44 5f 43 48 45 43 4b 53 0a 20 20 20 7c 7c  DED_CHECKS.   ||
18fe0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18ff0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 0a  nfig.bCoreMutex.
19000 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
19010 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
19020 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
19030 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
19040 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
19050 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
19060 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
19070 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
19080 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
19090 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
190a0 7d 0a 20 20 20 20 69 66 28 20 69 73 54 68 72 65  }.    if( isThre
190b0 61 64 73 61 66 65 3d 3d 30 20 29 7b 0a 20 20 20  adsafe==0 ){.   
190c0 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 57     sqlite3MutexW
190d0 61 72 6e 4f 6e 43 6f 6e 74 65 6e 74 69 6f 6e 28  arnOnContention(
190e0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
190f0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
19100 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
19110 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
19120 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
19130 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
19140 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
19150 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
19160 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
19170 62 53 74 61 74 69 63 3b 0a 20 20 64 62 2d 3e 6c  bStatic;.  db->l
19180 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
19190 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
191a0 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  ( sizeof(db->aLi
191b0 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61  mit)==sizeof(aHa
191c0 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65  rdLimit) );.  me
191d0 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c  mcpy(db->aLimit,
191e0 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a   aHardLimit, siz
191f0 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29  eof(db->aLimit))
19200 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ;.  db->aLimit[S
19210 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
19220 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51  ER_THREADS] = SQ
19230 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52  LITE_DEFAULT_WOR
19240 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64  KER_THREADS;.  d
19250 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
19260 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74  1;.  db->nextAut
19270 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d  ovac = -1;.  db-
19280 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65  >szMmap = sqlite
19290 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
192a0 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74  Mmap;.  db->next
192b0 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20  Pagesize = 0;.  
192c0 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
192d0 61 70 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b  ap = 0x7FFFFFFF;
192e0 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
192f0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
19300 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e  ames | SQLITE_En
19310 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51  ableTrigger | SQ
19320 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a  LITE_CacheSpill.
19330 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
19340 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
19350 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20  MATIC_INDEX) || 
19360 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
19370 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  | SQLITE_AutoInd
193a0 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ex.#endif.#if SQ
193b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50  LITE_DEFAULT_CKP
193c0 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20  TFULLFSYNC.     
193d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
193e0 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79  LITE_CkptFullFSy
193f0 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  nc.#endif.#if SQ
19400 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
19410 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
19420 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19430 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
19440 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
19450 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
19460 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
19480 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
19490 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
194a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
194b0 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
194c0 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
194d0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
194e0 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
194f0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19500 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
19510 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49  GN_KEYS) && SQLI
19520 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
19530 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20  GN_KEYS.        
19540 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
19550 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65  E_ForeignKeys.#e
19560 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
19570 28 53 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f  (SQLITE_REVERSE_
19580 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54  UNORDERED_SELECT
19590 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S).             
195a0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76      | SQLITE_Rev
195b0 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66  erseOrder.#endif
195c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
195d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
195e0 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19600 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   | SQLITE_CellSi
19610 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20  zeCk.#endif.#if 
19620 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
19630 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e  NABLE_FTS3_TOKEN
19640 49 5a 45 52 29 0a 20 20 20 20 20 20 20 20 20 20  IZER).          
19650 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
19660 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65  Fts3Tokenizer.#e
19670 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
19680 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 51  (SQLITE_ENABLE_Q
19690 50 53 47 29 0a 20 20 20 20 20 20 20 20 20 20 20  PSG).           
196a0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 45        | SQLITE_E
196b0 6e 61 62 6c 65 51 50 53 47 0a 23 65 6e 64 69 66  nableQPSG.#endif
196c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
196d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 44 45 46 45  ITE_DEFAULT_DEFE
196e0 4e 53 49 56 45 29 0a 20 20 20 20 20 20 20 20 20  NSIVE).         
196f0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
19700 5f 44 65 66 65 6e 73 69 76 65 0a 23 65 6e 64 69  _Defensive.#endi
19710 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
19720 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
19730 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
19740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19750 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
19760 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
19770 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
19780 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
19790 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
197a0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
197b0 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
197c0 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
197d0 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
197e0 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
197f0 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
19800 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
19810 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
19820 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
19830 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
19840 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
19850 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
19860 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44  ..  **.  ** EVID
19870 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36  ENCE-OF: R-52786
19880 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20 64 65  -44878 SQLite de
19890 66 69 6e 65 73 20 74 68 72 65 65 20 62 75 69 6c  fines three buil
198a0 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20  t-in collating. 
198b0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20   ** functions:. 
198c0 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
198d0 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65  ation(db, sqlite
198e0 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49  3StrBINARY, SQLI
198f0 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
19900 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
19910 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
19920 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  b, sqlite3StrBIN
19930 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ARY, SQLITE_UTF1
19940 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6BE, 0, binCollF
19950 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
19960 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73  eCollation(db, s
19970 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
19980 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
19990 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
199a0 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
199b0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41  lation(db, "NOCA
199c0 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  SE", SQLITE_UTF8
199d0 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61  , 0, nocaseColla
199e0 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20  tingFunc, 0);.  
199f0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
19a00 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
19a10 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
19a20 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
19a30 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
19a40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
19a50 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
19a60 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49  ut;.  }.  /* EVI
19a70 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30  DENCE-OF: R-0830
19a80 38 2d 31 37 32 32 34 20 54 68 65 20 64 65 66 61  8-17224 The defa
19a90 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ult collating fu
19aa0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20  nction for all. 
19ab0 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42   ** strings is B
19ac0 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64  INARY. .  */.  d
19ad0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
19ae0 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
19af0 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
19b00 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  8, sqlite3StrBIN
19b10 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ARY, 0);.  asser
19b20 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  t( db->pDfltColl
19b30 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  !=0 );..  /* Par
19b40 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f  se the filename/
19b50 55 52 49 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a  URI argument.  *
19b60 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20 61 6c 6c 6f  *.  ** Only allo
19b70 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69  w sensible combi
19b80 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20  nations of bits 
19b90 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72 67  in the flags arg
19ba0 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68  ument.  .  ** Th
19bb0 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
19bc0 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f  any non-sense co
19bd0 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65  mbination is use
19be0 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64  d.  If we.  ** d
19bf0 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65  o not block ille
19c00 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  gal combinations
19c10 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20   here, it could 
19c20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73  trigger.  ** ass
19c30 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
19c40 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72   in deeper layer
19c50 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d  s.  Sensible com
19c60 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61  binations.  ** a
19c70 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31  re:.  **.  **  1
19c80 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
19c90 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a  EADONLY.  **  2:
19ca0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
19cb0 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a  ADWRITE.  **  6:
19cc0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
19cd0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
19ce0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a  _OPEN_CREATE.  *
19cf0 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67  /.  db->openFlag
19d00 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 61 73 73  s = flags;.  ass
19d10 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
19d20 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78  _READONLY  == 0x
19d30 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  01 );.  assert( 
19d40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19d50 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b  WRITE == 0x02 );
19d60 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
19d70 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20  E_OPEN_CREATE   
19d80 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65   == 0x04 );.  te
19d90 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
19da0 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20  gs&7))==0x02 ); 
19db0 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20  /* READONLY */. 
19dc0 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
19dd0 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20  flags&7))==0x04 
19de0 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
19df0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
19e00 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
19e10 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x40 ); /* READWR
19e20 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a  ITE | CREATE */.
19e30 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67    if( ((1<<(flag
19e40 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30  s&7)) & 0x46)==0
19e50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
19e60 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
19e70 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39    /* IMP: R-6549
19e80 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 65 6c  7-44594 */.  }el
19e90 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
19ea0 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66  ite3ParseUri(zVf
19eb0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  s, zFilename, &f
19ec0 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c  lags, &db->pVfs,
19ed0 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73   &zOpen, &zErrMs
19ee0 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  g);.  }.  if( rc
19ef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19f00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19f10 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69 74 65  E_NOMEM ) sqlite
19f20 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
19f30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
19f40 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a  ithMsg(db, rc, z
19f50 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
19f60 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  0, zErrMsg);.   
19f70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
19f80 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f  rrMsg);.    goto
19f90 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
19fa0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
19fb0 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65  backend database
19fc0 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20   driver */.  rc 
19fd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
19fe0 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70  en(db->pVfs, zOp
19ff0 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62  en, db, &db->aDb
1a000 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20  [0].pBt, 0,.    
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49      flags | SQLI
1a030 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
1a040 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1a060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1a070 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  R_NOMEM ){.     
1a080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1a090 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
1a0a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
1a0b0 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74  db, rc);.    got
1a0c0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
1a0d0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1a0e0 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Enter(db->aDb[0]
1a0f0 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
1a100 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [0].pSchema = sq
1a110 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
1a120 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  b, db->aDb[0].pB
1a130 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  t);.  if( !db->m
1a140 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e  allocFailed ) EN
1a150 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45  C(db) = SCHEMA_E
1a160 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  NC(db);.  sqlite
1a170 33 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e  3BtreeLeave(db->
1a180 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
1a190 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1a1a0 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
1a1b0 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20  aGet(db, 0);..  
1a1c0 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  /* The default s
1a1d0 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20  afety_level for 
1a1e0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1a1f0 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72 20 74  e is FULL; for t
1a200 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
1a210 61 62 61 73 65 20 69 74 20 69 73 20 4f 46 46 2e  abase it is OFF.
1a220 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
1a230 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
1a240 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
1a250 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53   db->aDb[0].zDbS
1a260 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
1a270 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
1a280 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54  ty_level = SQLIT
1a290 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
1a2a0 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64 62 2d 3e 61  ONOUS+1;.  db->a
1a2b0 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d  Db[1].zDbSName =
1a2c0 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61   "temp";.  db->a
1a2d0 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[1].safety_lev
1a2e0 65 6c 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 48  el = PAGER_SYNCH
1a2f0 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20 20 64  RONOUS_OFF;..  d
1a300 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1a310 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20  E_MAGIC_OPEN;.  
1a320 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1a330 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1a340 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
1a350 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
1a360 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  all built-in fun
1a370 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e  ctions, but do n
1a380 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ot attempt to re
1a390 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ad the.  ** data
1a3a0 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e  base schema yet.
1a3b0 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64   This is delayed
1a3c0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
1a3d0 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
1a3e0 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73  se.  ** is acces
1a3f0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
1a400 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
1a410 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
1a420 65 33 52 65 67 69 73 74 65 72 50 65 72 43 6f 6e  e3RegisterPerCon
1a430 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75  nectionBuiltinFu
1a440 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72  nctions(db);.  r
1a450 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
1a460 6f 64 65 28 64 62 29 3b 0a 0a 23 69 66 64 65 66  ode(db);..#ifdef
1a470 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
1a480 54 53 35 0a 20 20 2f 2a 20 52 65 67 69 73 74 65  TS5.  /* Registe
1a490 72 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 46  r any built-in F
1a4a0 54 53 35 20 6d 6f 64 75 6c 65 20 62 65 66 6f 72  TS5 module befor
1a4b0 65 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 61 75  e loading the au
1a4c0 74 6f 6d 61 74 69 63 0a 20 20 2a 2a 20 65 78 74  tomatic.  ** ext
1a4d0 65 6e 73 69 6f 6e 73 2e 20 54 68 69 73 20 61 6c  ensions. This al
1a4e0 6c 6f 77 73 20 61 75 74 6f 6d 61 74 69 63 20 65  lows automatic e
1a4f0 78 74 65 6e 73 69 6f 6e 73 20 74 6f 20 72 65 67  xtensions to reg
1a500 69 73 74 65 72 20 46 54 53 35 20 0a 20 20 2a 2a  ister FTS5 .  **
1a510 20 74 6f 6b 65 6e 69 7a 65 72 73 20 61 6e 64 20   tokenizers and 
1a520 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69  auxiliary functi
1a530 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ons.  */.  if( !
1a540 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a550 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a560 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1a570 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28 64 62  lite3Fts5Init(db
1a580 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1a590 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
1a5a0 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
1a5b0 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
1a5c0 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
1a5d0 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
1a5e0 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
1a5f0 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
1a600 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66  ) API..  */.  if
1a610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a620 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
1a630 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73  toLoadExtensions
1a640 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  (db);.    rc = s
1a650 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
1a660 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  b);.    if( rc!=
1a670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a680 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
1a690 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ut;.    }.  }..#
1a6a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a6b0 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21  BLE_FTS1.  if( !
1a6c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a6d0 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
1a6e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e  nt sqlite3Fts1In
1a6f0 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
1a700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
1a710 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s1Init(db);.  }.
1a720 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1a730 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1a740 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  2.  if( !db->mal
1a750 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1a760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a770 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
1a780 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c  ite3Fts2Init(sql
1a790 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
1a7a0 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
1a7b0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1a7c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a7d0 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61  ENABLE_FTS3 /* a
1a7e0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66  utomatically def
1a7f0 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f 45  ined by SQLITE_E
1a800 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20  NABLE_FTS4 */.  
1a810 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1a820 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
1a830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a840 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e   = sqlite3Fts3In
1a850 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
1a860 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1a870 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
1a880 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
1a890 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
1a8a0 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 20 20 69 66  COLLATIONS).  if
1a8b0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a8c0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1a8d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1a8e0 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28   sqlite3IcuInit(
1a8f0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1a900 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a910 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66  NABLE_RTREE.  if
1a920 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a930 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1a940 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
1a950 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74  sqlite3RtreeInit
1a960 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1a970 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a980 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54  ENABLE_DBPAGE_VT
1a990 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  AB.  if( !db->ma
1a9a0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1a9b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
1a9c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62    rc = sqlite3Db
1a9d0 70 61 67 65 52 65 67 69 73 74 65 72 28 64 62 29  pageRegister(db)
1a9e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1a9f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1aa00 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42 0a 20  LE_DBSTAT_VTAB. 
1aa10 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1aa20 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1aa30 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
1aa40 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74 61 74   = sqlite3Dbstat
1aa50 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20  Register(db);.  
1aa60 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1aa70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a   SQLITE_ENABLE_J
1aa80 53 4f 4e 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  SON1.  if( !db->
1aa90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
1aaa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
1aab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1aac0 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20  Json1Init(db);. 
1aad0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
1aae0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1aaf0 53 54 4d 54 56 54 41 42 0a 20 20 69 66 28 20 21  STMTVTAB.  if( !
1ab00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ab10 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1ab20 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
1ab30 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e 69 74  ite3StmtVtabInit
1ab40 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1ab50 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f  ..  /* -DSQLITE_
1ab60 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
1ab70 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43  MODE=1 makes EXC
1ab80 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75  LUSIVE the defau
1ab90 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
1aba0 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f  mode.  -DSQLITE_
1abb0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
1abc0 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d  MODE=0 make NORM
1abd0 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  AL the default l
1abe0 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
1abf0 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67  .  Doing nothing
1ac00 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b   at all also mak
1ac10 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  es NORMAL the de
1ac20 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64  fault..  */.#ifd
1ac30 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
1ac40 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20  T_LOCKING_MODE. 
1ac50 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64   db->dfltLockMod
1ac60 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1ac70 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b  LT_LOCKING_MODE;
1ac80 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  .  sqlite3PagerL
1ac90 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74  ockingMode(sqlit
1aca0 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
1acb0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20  >aDb[0].pBt),.  
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
1ace0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
1acf0 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ODE);.#endif..  
1ad00 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33  if( rc ) sqlite3
1ad10 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a  Error(db, rc);..
1ad20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20    /* Enable the 
1ad30 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63  lookaside-malloc
1ad40 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20   subsystem */.  
1ad50 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
1ad60 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f  b, 0, sqlite3Glo
1ad70 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
1ad80 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  aside,.         
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ada0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1adb0 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a  ig.nLookaside);.
1adc0 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  .  sqlite3_wal_a
1add0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
1ade0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
1adf0 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
1ae00 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75  INT);..opendb_ou
1ae10 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  t:.  if( db ){. 
1ae20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
1ae30 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72  utex!=0 || isThr
1ae40 65 61 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20  eadsafe==0.     
1ae50 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1ae60 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
1ae70 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20  llMutex==0 );.  
1ae80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ae90 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1aea0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1aeb0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
1aec0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
1aed0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
1aee0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72  NOMEM );.  if( r
1aef0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
1af00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
1af10 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62  lose(db);.    db
1af20 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
1af30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1af40 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
1af50 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
1af60 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44  SICK;.  }.  *ppD
1af70 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53  b = db;.#ifdef S
1af80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
1af90 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
1afa0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
1afb0 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
1afc0 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e  Opening a db han
1afd0 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61  dle. Fourth para
1afe0 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
1aff0 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  0. */.    void *
1b000 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c  pArg = sqlite3Gl
1b010 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
1b020 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74  ogArg;.    sqlit
1b030 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1b040 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c  Sqllog(pArg, db,
1b050 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a   zFilename, 0);.
1b060 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
1b070 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
1b080 53 5f 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72  S_CODEC).  if( r
1b090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73  c==SQLITE_OK ) s
1b0a0 71 6c 69 74 65 33 43 6f 64 65 63 51 75 65 72 79  qlite3CodecQuery
1b0b0 50 61 72 61 6d 65 74 65 72 73 28 64 62 2c 20 30  Parameters(db, 0
1b0c0 2c 20 7a 4f 70 65 6e 29 3b 0a 23 65 6e 64 69 66  , zOpen);.#endif
1b0d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1b0e0 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e  zOpen);.  return
1b0f0 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 0a   rc & 0xff;.}...
1b100 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
1b110 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1b120 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b130 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
1b140 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1b150 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
1b160 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  b .){.  return o
1b170 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
1b180 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20  ename, ppDb,.   
1b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
1b1b0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
1b1c0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
1b1d0 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1b1e0 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73  _open_v2(.  cons
1b1f0 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
1b200 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ,   /* Database 
1b210 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29  filename (UTF-8)
1b220 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
1b230 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  ppDb,         /*
1b240 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20   OUT: SQLite db 
1b250 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
1b260 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1b270 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
1b280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
1b290 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  fs        /* Nam
1b2a0 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20  e of VFS module 
1b2b0 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72  to use */.){.  r
1b2c0 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
1b2d0 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44  se(filename, ppD
1b2e0 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  b, (unsigned int
1b2f0 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d  )flags, zVfs);.}
1b300 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b310 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
1b320 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
1b330 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
1b340 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1b350 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69  n16(.  const voi
1b360 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  d *zFilename, . 
1b370 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a   sqlite3 **ppDb.
1b380 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
1b390 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f  *zFilename8;   /
1b3a0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f  * zFilename enco
1b3b0 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73  ded in UTF-8 ins
1b3c0 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a  tead of UTF-16 *
1b3d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1b3e0 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
1b3f0 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
1b400 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1b410 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
1b420 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b430 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1b440 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
1b450 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1b460 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
1b470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
1b480 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
1b490 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1b4a0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  ;.#endif.  if( z
1b4b0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46  Filename==0 ) zF
1b4c0 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c  ilename = "\000\
1b4d0 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73  000";.  pVal = s
1b4e0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
1b4f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
1b500 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
1b510 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c  , zFilename, SQL
1b520 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c  ITE_UTF16NATIVE,
1b530 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1b540 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20  .  zFilename8 = 
1b550 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1b560 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
1b570 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  F8);.  if( zFile
1b580 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  name8 ){.    rc 
1b590 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  = openDatabase(z
1b5a0 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c  Filename8, ppDb,
1b5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b5c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b5d0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1b5e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1b5f0 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  E, 0);.    asser
1b600 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d  t( *ppDb || rc==
1b610 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
1b620 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b630 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50  TE_OK && !DbHasP
1b640 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30  roperty(*ppDb, 0
1b650 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
1b660 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45  d) ){.      SCHE
1b670 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20  MA_ENC(*ppDb) = 
1b680 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c  ENC(*ppDb) = SQL
1b690 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
1b6a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1b6b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b6c0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
1b6d0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
1b6e0 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
1b6f0 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d  urn rc & 0xff;.}
1b700 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1b710 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1b720 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
1b730 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
1b740 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
1b750 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1b760 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
1b770 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
1b780 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
1b790 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
1b7a0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
1b7b0 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
1b7c0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
1b7d0 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
1b7e0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
1b7f0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
1b800 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1b810 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
1b820 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65  ion_v2(db, zName
1b830 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  , enc, pCtx, xCo
1b840 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  mpare, 0);.}../*
1b850 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
1b860 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
1b870 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
1b880 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
1b890 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
1b8a0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1b8b0 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
1b8c0 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
1b8d0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
1b8e0 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
1b8f0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
1b900 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
1b910 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
1b920 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
1b930 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
1b940 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
1b950 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1b960 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1b970 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1b980 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1b990 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
1b9a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1b9b0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1b9c0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1b9d0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1b9e0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
1b9f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ba00 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
1ba10 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
1ba20 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
1ba30 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
1ba40 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
1ba50 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
1ba60 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
1ba70 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1ba80 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1ba90 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1baa0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1bab0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
1bac0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
1bad0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
1bae0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1baf0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
1bb00 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
1bb10 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
1bb20 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
1bb30 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
1bb40 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
1bb50 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
1bb60 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
1bb70 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
1bb80 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
1bb90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1bba0 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
1bbb0 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20  zName8;..#ifdef 
1bbc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1bbd0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1bbe0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1bbf0 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
1bc00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1bc10 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1bc20 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1bc30 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1bc40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
1bc50 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
1bc60 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
1bc70 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
1bc80 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
1bc90 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
1bca0 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e  ATIVE);.  if( zN
1bcb0 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
1bcc0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
1bcd0 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38  (db, zName8, (u8
1bce0 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
1bcf0 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
1bd00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1bd10 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
1bd20 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
1bd30 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
1bd40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1bd50 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1bd60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1bd70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1bd80 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
1bd90 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
1bda0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1bdb0 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
1bdc0 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
1bdd0 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
1bde0 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
1bdf0 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
1be00 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
1be10 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1be20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1be30 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
1be40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
1be50 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
1be60 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
1be70 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
1be80 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
1be90 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
1bea0 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66  char*).){.#ifdef
1beb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1bec0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1bed0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1bee0 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1bef0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1bf00 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1bf10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1bf20 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1bf30 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
1bf40 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a   = xCollNeeded;.
1bf50 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1bf60 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70  d16 = 0;.  db->p
1bf70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
1bf80 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
1bf90 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bfa0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1bfb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1bfc0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1bfd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1bfe0 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
1bff0 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
1c000 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
1c010 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
1c020 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1c030 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
1c040 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
1c050 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
1c060 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
1c070 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
1c080 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
1c090 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65  eded16(.  sqlite
1c0a0 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
1c0b0 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
1c0c0 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
1c0d0 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71  eded16)(void*,sq
1c0e0 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1c0f0 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  Rep,const void*)
1c100 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1c110 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1c120 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1c130 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1c140 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1c150 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1c160 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1c170 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1c180 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1c190 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a  CollNeeded = 0;.
1c1a0 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1c1b0 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  d16 = xCollNeede
1c1c0 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  d16;.  db->pColl
1c1d0 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
1c1e0 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
1c1f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1c200 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1c210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c220 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1c230 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1c240 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1c250 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
1c260 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ED./*.** This fu
1c270 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
1c280 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
1c290 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
1c2a0 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
1c2b0 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
1c2c0 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
1c2d0 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
1c2e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
1c2f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
1c300 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
1c310 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
1c320 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1c330 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
1c340 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
1c350 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
1c360 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
1c370 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
1c380 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
1c390 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
1c3a0 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
1c3b0 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
1c3c0 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
1c3d0 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
1c3e0 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
1c3f0 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
1c400 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
1c410 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
1c420 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
1c430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c440 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
1c450 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
1c460 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c470 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1c480 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1c490 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1c4a0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1c4b0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1c4c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1c4d0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1c4e0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a  db->autoCommit;.
1c4f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1c500 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
1c510 61 72 65 20 73 75 62 73 74 69 74 75 74 65 73 20  are substitutes 
1c520 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51  for constants SQ
1c530 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a  LITE_CORRUPT,.**
1c540 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20   SQLITE_MISUSE, 
1c550 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
1c560 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1c570 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72  d possibly other
1c580 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61   error.** consta
1c590 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65  nts.  They serve
1c5a0 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a   two purposes:.*
1c5b0 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65  *.**   1.  Serve
1c5c0 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74   as a convenient
1c5d0 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
1c5e0 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20  breakpoint in a 
1c5f0 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20  debugger.**     
1c600 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e    to detect when
1c610 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63   version error c
1c620 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73  onditions occurs
1c630 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e  ..**.**   2.  In
1c640 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67  voke sqlite3_log
1c650 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  () to provide th
1c660 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f  e source code lo
1c670 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  cation where.** 
1c680 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65        a low-leve
1c690 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74  l error is first
1c6a0 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e   detected..*/.in
1c6b0 74 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45  t sqlite3ReportE
1c6c0 72 72 6f 72 28 69 6e 74 20 69 45 72 72 2c 20 69  rror(int iErr, i
1c6d0 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74  nt lineno, const
1c6e0 20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20   char *zType){. 
1c6f0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72   sqlite3_log(iEr
1c700 72 2c 20 22 25 73 20 61 74 20 6c 69 6e 65 20 25  r, "%s at line %
1c710 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79               zTy
1c730 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73  pe, lineno, 20+s
1c740 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
1c750 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 45 72  ));.  return iEr
1c760 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  r;.}.int sqlite3
1c770 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
1c780 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1c790 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1c7a0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1c7b0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
1c7c0 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1c7d0 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c  (SQLITE_CORRUPT,
1c7e0 20 6c 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61   lineno, "databa
1c7f0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b  se corruption");
1c800 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69  .}.int sqlite3Mi
1c810 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69  suseError(int li
1c820 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1c830 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1c840 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1c850 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1c860 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1c870 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e  LITE_MISUSE, lin
1c880 65 6e 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a  eno, "misuse");.
1c890 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e  }.int sqlite3Can
1c8a0 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c  topenError(int l
1c8b0 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1c8c0 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1c8d0 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1c8e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1c8f0 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53  te3ReportError(S
1c900 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
1c910 6c 69 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20  lineno, "cannot 
1c920 6f 70 65 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23  open file");.}.#
1c930 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c940 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  UG.int sqlite3Co
1c950 72 72 75 70 74 50 67 6e 6f 45 72 72 6f 72 28 69  rruptPgnoError(i
1c960 6e 74 20 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20  nt lineno, Pgno 
1c970 70 67 6e 6f 29 7b 0a 20 20 63 68 61 72 20 7a 4d  pgno){.  char zM
1c980 73 67 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74  sg[100];.  sqlit
1c990 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1c9a0 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c 20  of(zMsg), zMsg, 
1c9b0 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
1c9c0 74 69 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 70  tion page %d", p
1c9d0 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
1c9e0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1c9f0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1ca00 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1ca10 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1ca20 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e  ITE_CORRUPT, lin
1ca30 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e  eno, zMsg);.}.in
1ca40 74 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72  t sqlite3NomemEr
1ca50 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1ca60 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1ca70 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ca80 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1ca90 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1caa0 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e  rtError(SQLITE_N
1cab0 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f  OMEM, lineno, "O
1cac0 4f 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  OM");.}.int sqli
1cad0 74 65 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72  te3IoerrnomemErr
1cae0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1caf0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1cb00 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cb10 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1cb20 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1cb30 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  tError(SQLITE_IO
1cb40 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e  ERR_NOMEM, linen
1cb50 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f  o, "I/O OOM erro
1cb60 72 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  r");.}.#endif..#
1cb70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cb80 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1cb90 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
1cba0 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
1cbb0 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
1cbc0 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
1cbd0 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
1cbe0 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
1cbf0 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
1cc00 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
1cc10 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
1cc20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
1cc30 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
1cc40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
1cc50 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
1cc60 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
1cc70 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
1cc80 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
1cc90 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
1cca0 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
1ccb0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1ccc0 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
1ccd0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
1cce0 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
1ccf0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
1cd00 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
1cd10 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
1cd20 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
1cd30 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
1cd40 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
1cd50 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
1cd60 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
1cd70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cd80 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1cd90 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
1cda0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1cdb0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1cdc0 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
1cdd0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1cde0 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
1cdf0 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
1ce00 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1ce10 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
1ce20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
1ce30 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
1ce40 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
1ce50 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
1ce60 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
1ce70 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
1ce80 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
1ce90 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
1cea0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1ceb0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
1cec0 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
1ced0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1cee0 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
1cef0 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
1cf00 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
1cf10 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
1cf20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1cf30 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
1cf40 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
1cf50 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
1cf60 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1cf70 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
1cf80 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
1cf90 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
1cfa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cfb0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1cfc0 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
1cfd0 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
1cfe0 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
1cff0 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68  t iCol = 0;.  ch
1d000 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
1d010 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
1d020 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
1d030 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
1d040 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
1d050 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
1d060 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
1d070 0a 20 20 69 6e 74 20 62 55 6e 6c 6f 63 6b 3b 0a  .  int bUnlock;.
1d080 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1d090 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1d0a0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1d0b0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1d0c0 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30  || zTableName==0
1d0d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1d0e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1d0f0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
1d100 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
1d110 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
1d120 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
1d130 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1d140 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1d150 78 29 3b 0a 20 20 62 55 6e 6c 6f 63 6b 20 3d 20  x);.  bUnlock = 
1d160 73 71 6c 69 74 65 33 4c 6f 63 6b 52 65 75 73 61  sqlite3LockReusa
1d170 62 6c 65 53 63 68 65 6d 61 28 64 62 29 3b 0a 20  bleSchema(db);. 
1d180 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1d190 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28  erAll(db);.  if(
1d1a0 20 49 73 53 68 61 72 65 64 53 63 68 65 6d 61 28   IsSharedSchema(
1d1b0 64 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  db)==0 ){.    rc
1d1c0 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
1d1d0 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  b, &zErrMsg);.  
1d1e0 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
1d1f0 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
1d200 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 72 63  tion */.  if( rc
1d210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
1d220 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1d230 42 4c 45 5f 53 48 41 52 45 44 5f 53 43 48 45 4d  BLE_SHARED_SCHEM
1d240 41 0a 20 20 20 20 50 61 72 73 65 20 73 50 61 72  A.    Parse sPar
1d250 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1d260 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 50 61        /* Fake Pa
1d270 72 73 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 46  rse object for F
1d280 69 6e 64 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20  indTable */.    
1d290 50 61 72 73 65 20 2a 70 53 61 76 65 64 20 3d 20  Parse *pSaved = 
1d2a0 64 62 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  db->pParse;.    
1d2b0 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20  memset(&sParse, 
1d2c0 30 2c 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65  0, sizeof(sParse
1d2d0 29 29 3b 0a 20 20 20 20 64 62 2d 3e 70 50 61 72  ));.    db->pPar
1d2e0 73 65 20 3d 20 26 73 50 61 72 73 65 3b 0a 23 65  se = &sParse;.#e
1d2f0 6e 64 69 66 0a 20 20 20 20 70 54 61 62 20 3d 20  ndif.    pTab = 
1d300 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1d310 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
1d320 20 7a 44 62 4e 61 6d 65 29 3b 0a 23 69 66 64 65   zDbName);.#ifde
1d330 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1d340 53 48 41 52 45 44 5f 53 43 48 45 4d 41 0a 20 20  SHARED_SCHEMA.  
1d350 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
1d360 50 61 72 73 65 2e 7a 45 72 72 4d 73 67 29 3b 0a  Parse.zErrMsg);.
1d370 20 20 20 20 72 63 20 3d 20 73 50 61 72 73 65 2e      rc = sParse.
1d380 72 63 3b 0a 20 20 20 20 64 62 2d 3e 70 50 61 72  rc;.    db->pPar
1d390 73 65 20 3d 20 70 53 61 76 65 64 3b 0a 23 65 6e  se = pSaved;.#en
1d3a0 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 53 51  dif.  }.  if( SQ
1d3b0 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
1d3c0 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 0a 20  to error_out;.. 
1d3d0 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54   if( !pTab || pT
1d3e0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
1d3f0 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
1d400 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
1d410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
1d420 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77  the column for w
1d430 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71  hich info is req
1d440 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  uested */.  if( 
1d450 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29  zColumnName==0 )
1d460 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66  {.    /* Query f
1d470 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  or existance of 
1d480 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  table only */.  
1d490 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
1d4a0 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
1d4b0 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
1d4c0 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
1d4d0 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
1d4e0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
1d4f0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
1d500 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d  l->zName, zColum
1d510 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
1d520 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1d530 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1d540 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  Col==pTab->nCol 
1d550 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  ){.      if( Has
1d560 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 73  Rowid(pTab) && s
1d570 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
1d580 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
1d590 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61        iCol = pTa
1d5a0 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
1d5b0 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30    pCol = iCol>=0
1d5c0 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   ? &pTab->aCol[i
1d5d0 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20  Col] : 0;.      
1d5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1d5f0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
1d600 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
1d610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d620 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1d630 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f  lowing block sto
1d640 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66  res the meta inf
1d650 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
1d660 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20  ll be returned. 
1d670 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65   ** to the calle
1d680 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  r in local varia
1d690 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20  bles zDataType, 
1d6a0 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c  zCollSeq, notnul
1d6b0 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20  l, primarykey.  
1d6c0 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20  ** and autoinc. 
1d6d0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1d6e0 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73  ere are two poss
1d6f0 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20  ibilities:.  ** 
1d700 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65  .  **     1. The
1d710 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d   specified colum
1d720 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64  n name was rowid
1d730 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f  ", "oid" or "_ro
1d740 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20  wid_" .  **     
1d750 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20     and there is 
1d760 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65  no explicitly de
1d770 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d  clared IPK colum
1d780 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  n. .  **.  **   
1d790 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69    2. The table i
1d7a0 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64  s not a view and
1d7b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
1d7c0 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a   identified an .
1d7d0 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c    **        expl
1d7e0 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
1d7f0 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74  column. Copy met
1d800 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
1d810 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a  om *pCol..  */ .
1d820 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20    if( pCol ){.  
1d830 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71    zDataType = sq
1d840 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
1d850 70 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f  pCol,0);.    zCo
1d860 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
1d870 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
1d880 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c   = pCol->notNull
1d890 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  !=0;.    primary
1d8a0 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f  key  = (pCol->co
1d8b0 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
1d8c0 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20  _PRIMKEY)!=0;.  
1d8d0 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
1d8e0 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
1d8f0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1d900 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
1d910 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ent)!=0;.  }else
1d920 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
1d930 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
1d940 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b   primarykey = 1;
1d950 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c  .  }.  if( !zCol
1d960 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c  lSeq ){.    zCol
1d970 6c 53 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74  lSeq = sqlite3St
1d980 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72  rBINARY;.  }..er
1d990 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
1d9a0 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
1d9b0 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68  db);..  /* Wheth
1d9c0 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  er the function 
1d9d0 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f  call succeeded o
1d9e0 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68  r failed, set th
1d9f0 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
1da00 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74  ers.  ** to what
1da10 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c  ever their local
1da20 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f   counterparts co
1da30 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72  ntain. If an err
1da40 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20  or did occur,.  
1da50 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20  ** this has the 
1da60 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e  effect of zeroin
1da70 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72  g all output par
1da80 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
1da90 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29  if( pzDataType )
1daa0 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a   *pzDataType = z
1dab0 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20  DataType;.  if( 
1dac0 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43  pzCollSeq ) *pzC
1dad0 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65  ollSeq = zCollSe
1dae0 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c  q;.  if( pNotNul
1daf0 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20  l ) *pNotNull = 
1db00 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70  notnull;.  if( p
1db10 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50  PrimaryKey ) *pP
1db20 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d  rimaryKey = prim
1db30 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41  arykey;.  if( pA
1db40 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69  utoinc ) *pAutoi
1db50 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20  nc = autoinc;.. 
1db60 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
1db70 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  rc && !pTab ){. 
1db80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1db90 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
1dba0 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
1dbb0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1dbc0 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
1dbd0 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a  olumn: %s.%s", z
1dbe0 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
1dbf0 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b     zColumnName);
1dc00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1dc10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
1dc20 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
1dc30 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d  g(db, rc, (zErrM
1dc40 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72  sg?"%s":0), zErr
1dc50 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1dc60 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1dc70 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  g);.  rc = sqlit
1dc80 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
1dc90 29 3b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 6f  );.  sqlite3Unlo
1dca0 63 6b 52 65 75 73 61 62 6c 65 53 63 68 65 6d 61  ckReusableSchema
1dcb0 28 64 62 2c 20 62 55 6e 6c 6f 63 6b 29 3b 0a 20  (db, bUnlock);. 
1dcc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1dcd0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1dce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dcf0 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
1dd00 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
1dd10 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
1dd20 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
1dd30 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1dd40 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b  3_sleep(int ms){
1dd50 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1dd60 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
1dd70 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33    pVfs = sqlite3
1dd80 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1dd90 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65  if( pVfs==0 ) re
1dda0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  turn 0;..  /* Th
1ddb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
1ddc0 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s in millisecond
1ddd0 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72  s, but the under
1dde0 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20  lying OsSleep() 
1ddf0 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d  .  ** API uses m
1de00 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e  icroseconds. Hen
1de10 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20  ce the 1000's.. 
1de20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69   */.  rc = (sqli
1de30 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c  te3OsSleep(pVfs,
1de40 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b   1000*ms)/1000);
1de50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1de60 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  ./*.** Enable or
1de70 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74   disable the ext
1de80 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64  ended result cod
1de90 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1dea0 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
1deb0 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33  lt_codes(sqlite3
1dec0 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29   *db, int onoff)
1ded0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1dee0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1def0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1df00 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1df10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1df20 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
1df30 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1df40 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1df50 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
1df60 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
1df70 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
1df80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1df90 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1dfa0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1dfb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1dfc0 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
1dfd0 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
1dfe0 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
1dff0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
1e000 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1e010 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
1e020 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1e030 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
1e040 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
1e050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
1e060 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
1e070 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53  Btree;..#ifdef S
1e080 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1e090 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1e0a0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1e0b0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1e0c0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1e0d0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1e0e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e0f0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
1e100 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  Btree = sqlite3D
1e110 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1e120 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
1e130 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50   pBtree ){.    P
1e140 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
1e150 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1e160 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  fd;.    sqlite3B
1e170 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1e180 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
1e190 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
1e1a0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61  r(pBtree);.    a
1e1b0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1e1c0 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c   );.    fd = sql
1e1d0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
1e1e0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
1e1f0 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
1e200 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1e210 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
1e220 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1e230 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
1e240 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20   = fd;.      rc 
1e250 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1e260 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53   }else if( op==S
1e270 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f  QLITE_FCNTL_VFS_
1e280 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1e290 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a   *(sqlite3_vfs**
1e2a0 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50  )pArg = sqlite3P
1e2b0 61 67 65 72 56 66 73 28 70 50 61 67 65 72 29 3b  agerVfs(pPager);
1e2c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e2d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1e2e0 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1e2f0 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f  FCNTL_JOURNAL_PO
1e300 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1e310 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29  (sqlite3_file**)
1e320 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1e330 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67  gerJrnlFile(pPag
1e340 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1e350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e360 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1e370 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56  ITE_FCNTL_DATA_V
1e380 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  ERSION ){.      
1e390 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29  *(unsigned int*)
1e3a0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1e3b0 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 70  gerDataVersion(p
1e3c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1e3d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e3e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1e3f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1e400 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
1e410 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pArg);.    }.  
1e420 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1e430 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1e440 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1e450 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1e460 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1e470 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
1e480 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
1e490 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
1e4a0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e4b0 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
1e4c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1e4d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
1e4e0 4e 54 45 53 54 41 42 4c 45 0a 20 20 55 4e 55 53  NTESTABLE.  UNUS
1e4f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70 29  ED_PARAMETER(op)
1e500 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73  ;.#else.  va_lis
1e510 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
1e520 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
1e530 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
1e540 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68  *.    ** Save th
1e550 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1e560 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20  of the PRNG..   
1e570 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e580 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1e590 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20  G_SAVE: {.      
1e5a0 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53  sqlite3PrngSaveS
1e5b0 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
1e5c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1e5d0 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72  /*.    ** Restor
1e5e0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
1e5f0 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c  he PRNG to the l
1e600 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20  ast state saved 
1e610 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e  using.    ** PRN
1e620 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47  G_SAVE.  If PRNG
1e630 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20  _SAVE has never 
1e640 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c  before been call
1e650 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
1e660 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c  this verb acts l
1e670 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a  ike PRNG_RESET..
1e680 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e690 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e6a0 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  PRNG_RESTORE: {.
1e6b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1e6c0 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b  gRestoreState();
1e6d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e6e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1e6f0 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e  ** Reset the PRN
1e700 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e  G back to its un
1e710 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74  initialized stat
1e720 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c  e.  The next cal
1e730 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
1e740 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29  te3_randomness()
1e750 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65   will reseed the
1e760 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69   PRNG using a si
1e770 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  ngle call.    **
1e780 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e   to the xRandomn
1e790 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  ess method of th
1e7a0 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20  e default VFS.. 
1e7b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1e7c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1e7d0 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20  RNG_RESET: {.   
1e7e0 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
1e7f0 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20  mness(0,0);.    
1e800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1e810 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1e820 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1e830 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c  rol(BITVEC_TEST,
1e840 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a   size, program).
1e850 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75      **.    ** Ru
1e860 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74  n a test against
1e870 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74   a Bitvec object
1e880 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70   of size.  The p
1e890 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a  rogram argument.
1e8a0 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72      ** is an arr
1e8b0 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74  ay of integers t
1e8c0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
1e8d0 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31  test.  Return -1
1e8e0 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d   on a.    ** mem
1e8f0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
1e900 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65  rror, 0 on succe
1e910 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  ss, or non-zero 
1e920 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  for an error..  
1e930 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c    ** See the sql
1e940 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
1e950 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69  nTest() for addi
1e960 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1e970 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  on..    */.    c
1e980 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e990 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a  TRL_BITVEC_TEST:
1e9a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20   {.      int sz 
1e9b0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1e9c0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50  );.      int *aP
1e9d0 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  rog = va_arg(ap,
1e9e0 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63   int*);.      rc
1e9f0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1ea00 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20  BuiltinTest(sz, 
1ea10 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72  aProg);.      br
1ea20 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ea30 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1ea40 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ea50 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78  FAULT_INSTALL, x
1ea60 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a  Callback).    **
1ea70 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20  .    ** Arrange 
1ea80 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62  to invoke xCallb
1ea90 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73  ack() whenever s
1eaa0 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29  qlite3FaultSim()
1eab0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20   is called,.    
1eac0 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20  ** if xCallback 
1ead0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
1eae0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20   **.    ** As a 
1eaf0 74 65 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c  test of the faul
1eb00 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68  t simulator mech
1eb10 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71  anism itself, sq
1eb20 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
1eb30 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  .    ** is calle
1eb40 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  d immediately af
1eb50 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74  ter installing t
1eb60 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20  he new callback 
1eb70 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20  and the return. 
1eb80 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d     ** value from
1eb90 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1eba0 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  (0) becomes the 
1ebb0 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20  return from.    
1ebc0 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
1ebd0 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a  control()..    *
1ebe0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1ebf0 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54  E_TESTCTRL_FAULT
1ec00 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20  _INSTALL: {.    
1ec10 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
1ec20 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
1ec30 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
1ec40 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
1ec50 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
1ec60 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
1ec70 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
1ec80 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
1ec90 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62  onfig.xTestCallb
1eca0 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ack = va_arg(ap,
1ecb0 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20   int(*)(int));. 
1ecc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79       */.      ty
1ecd0 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43  pedef int(*TESTC
1ece0 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69  ALLBACKFUNC_t)(i
1ecf0 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1ed00 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1ed10 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76  TestCallback = v
1ed20 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43 41  a_arg(ap, TESTCA
1ed30 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20  LLBACKFUNC_t);. 
1ed40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ed50 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20  3FaultSim(0);.  
1ed60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ed70 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1ed80 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ed90 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c  ntrol(BENIGN_MAL
1eda0 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69  LOC_HOOKS, xBegi
1edb0 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a  n, xEnd).    **.
1edc0 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20      ** Register 
1edd0 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f  hooks to call to
1ede0 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20   indicate which 
1edf0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1ee00 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65  s .    ** are be
1ee10 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nign..    */.   
1ee20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1ee30 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
1ee40 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20  LOC_HOOKS: {.   
1ee50 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
1ee60 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  (*void_function)
1ee70 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f  (void);.      vo
1ee80 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
1ee90 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ignBegin;.      
1eea0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1eeb0 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20  enignEnd;.      
1eec0 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76  xBenignBegin = v
1eed0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1eee0 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1eef0 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f  xBenignEnd = va_
1ef00 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
1ef10 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  ction);.      sq
1ef20 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f  lite3BenignMallo
1ef30 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65  cHooks(xBenignBe
1ef40 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29  gin, xBenignEnd)
1ef50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ef60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1ef70 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1ef80 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1ef90 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
1efa0 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64  G_BYTE, unsigned
1efb0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
1efc0 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45     ** Set the PE
1efd0 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68  NDING byte to th
1efe0 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  e value in the a
1eff0 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e  rgument, if X>0.
1f000 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20  .    ** Make no 
1f010 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e  changes if X==0.
1f020 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c    Return the val
1f030 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ue of the pendin
1f040 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73  g byte.    ** as
1f050 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66   it existing bef
1f060 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1f070 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
1f080 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52   **.    ** IMPOR
1f090 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20  TANT:  Changing 
1f0a0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1f0b0 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30   from 0x40000000
1f0c0 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20   results in.    
1f0d0 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ** an incompatib
1f0e0 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  le database file
1f0f0 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69   format.  Changi
1f100 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
1f110 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  yte.    ** while
1f120 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f   any database co
1f130 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
1f140 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65   results in unde
1f150 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  fined and.    **
1f160 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68   deleterious beh
1f170 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  avior..    */.  
1f180 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1f190 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
1f1a0 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  YTE: {.      rc 
1f1b0 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
1f1c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f1d0 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a  MIT_WSD.      {.
1f1e0 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1f1f0 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61   int newVal = va
1f200 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65  _arg(ap, unsigne
1f210 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  d int);.        
1f220 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c  if( newVal ) sql
1f230 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20  ite3PendingByte 
1f240 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20  = newVal;.      
1f250 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
1f260 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1f270 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1f280 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1f290 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1f2a0 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a  _ASSERT, int X).
1f2b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f2c0 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
1f2d0 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
1f2e0 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  st to see whethe
1f2f0 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  r or not.    ** 
1f300 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61  assert() was ena
1f310 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
1f320 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74  time.  If X is t
1f330 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  rue and assert()
1f340 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c  .    ** is enabl
1f350 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1f360 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75  urn value is tru
1f370 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
1f380 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65   and.    ** asse
1f390 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1f3a0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
1f3b0 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
1f3c0 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a    If X is.    **
1f3d0 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
1f3e0 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  t() is enabled, 
1f3f0 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69  then the asserti
1f400 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65  on fires and the
1f410 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1f420 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73  aborts.  If X is
1f430 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
1f440 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
1f450 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
1f460 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1f470 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
1f480 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1f490 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b  STCTRL_ASSERT: {
1f4a0 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20  .      volatile 
1f4b0 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20  int x = 0;.     
1f4c0 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64 65 2d   assert( /*side-
1f4d0 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20  effects-ok*/ (x 
1f4e0 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1f4f0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
1f500 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61   = x;.      brea
1f510 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1f520 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1f530 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1f540 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1f550 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20  LWAYS, int X).  
1f560 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1f570 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1f580 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1f590 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20   to see how the 
1f5a0 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a  ALWAYS and.    *
1f5b0 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77  * NEVER macros w
1f5c0 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63  ere defined at c
1f5d0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20  ompile-time..   
1f5e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1f5f0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41  eturn value is A
1f600 4c 57 41 59 53 28 58 29 20 69 66 20 58 20 69 73  LWAYS(X) if X is
1f610 20 74 72 75 65 2c 20 6f 72 20 30 20 69 66 20 58   true, or 0 if X
1f620 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1f630 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
1f640 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
1f650 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
1f660 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
1f670 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
1f680 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
1f690 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
1f6a0 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
1f6b0 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
1f6c0 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
1f6d0 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
1f6e0 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1f6f0 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
1f700 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
1f710 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
1f720 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
1f730 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
1f740 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
1f750 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
1f760 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
1f770 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
1f780 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
1f790 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
1f7a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1f7b0 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
1f7c0 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
1f7d0 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
1f7e0 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
1f7f0 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
1f800 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
1f810 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
1f820 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
1f830 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1f840 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1f850 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1f860 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1f870 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f880 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
1f890 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
1f8a0 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
1f8b0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1f8c0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
1f8d0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f8e0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1f8f0 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
1f900 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
1f910 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
1f920 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
1f930 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
1f940 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
1f950 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1f960 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f970 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f980 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
1f990 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1f9a0 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
1f9b0 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
1f9c0 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
1f9d0 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
1f9e0 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
1f9f0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1fa00 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
1fa10 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
1fa20 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
1fa30 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
1fa40 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1fa50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fa60 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
1fa70 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
1fa80 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
1fa90 20 3d 20 78 20 3f 20 41 4c 57 41 59 53 28 78 29   = x ? ALWAYS(x)
1faa0 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   : 0;.      brea
1fab0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1fac0 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  .    **   sqlite
1fad0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1fae0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1faf0 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a  YTEORDER);.    *
1fb00 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74  *.    ** The int
1fb10 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65  eger returned re
1fb20 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f  veals the byte-o
1fb30 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70  rder of the comp
1fb40 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20  uter on which.  
1fb50 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72    ** SQLite is r
1fb60 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20  unning:.    **. 
1fb70 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20     **       1   
1fb80 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
1fb90 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1fba0 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1fbb0 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c      10     littl
1fbc0 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d  e-endian, determ
1fbd0 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  ined at run-time
1fbe0 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20  .    **  432101 
1fbf0 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1fc00 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1fc10 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1fc20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20    **  123410    
1fc30 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
1fc40 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
1fc50 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
1fc60 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  / .    case SQLI
1fc70 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
1fc80 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ORDER: {.      r
1fc90 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f  c = SQLITE_BYTEO
1fca0 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54  RDER*100 + SQLIT
1fcb0 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31  E_LITTLEENDIAN*1
1fcc0 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e  0 + SQLITE_BIGEN
1fcd0 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61  DIAN;.      brea
1fce0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1fcf0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1fd00 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1fd10 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
1fd20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1fd30 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1fd40 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65  ** Set the nRese
1fd50 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f  rve size to N fo
1fd60 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
1fd70 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ase on the datab
1fd80 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65  ase.    ** conne
1fd90 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f  ction db..    */
1fda0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1fdb0 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1fdc0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1fdd0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1fde0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1fdf0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1fe00 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1fe10 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1fe20 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1fe30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1fe40 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
1fe50 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
1fe60 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20   0, x, 0);.     
1fe70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1fe80 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1fe90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fea0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1feb0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1fec0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1fed0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
1fee0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
1fef0 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
1ff00 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1ff10 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74  able various opt
1ff20 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74  imizations for t
1ff30 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
1ff40 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72    The .    ** ar
1ff50 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69  gument N is a bi
1ff60 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
1ff70 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ations to be dis
1ff80 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d  abled.  For norm
1ff90 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  al.    ** operat
1ffa0 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20  ion N should be 
1ffb0 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20  0.  The idea is 
1ffc0 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67  that a test prog
1ffd0 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20  ram (like the.  
1ffe0 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54    ** SQL Logic T
1fff0 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20  est or SLT test 
20000 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20  module) can run 
20010 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c  the same SQL mul
20020 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20  tiple times.    
20030 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20  ** with various 
20040 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69  optimizations di
20050 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79  sabled to verify
20060 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
20070 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  nswer.    ** is 
20080 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72  obtained in ever
20090 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  y case..    */. 
200a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
200b0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
200c0 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73  TIONS: {.      s
200d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
200e0 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
200f0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f  );.      db->dbO
20100 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28  ptFlags = (u16)(
20110 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20  va_arg(ap, int) 
20120 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20  & 0xffff);.     
20130 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
20140 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
20150 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
20160 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
20170 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
20180 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
20190 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
201a0 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
201b0 6e 2d 7a 65 72 6f 2c 20 73 75 62 73 65 71 75 65  n-zero, subseque
201c0 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61  nt calls to loca
201d0 6c 74 69 6d 65 28 29 0a 20 20 20 20 2a 2a 20 61  ltime().    ** a
201e0 6e 64 20 69 74 73 20 76 61 72 69 61 6e 74 73 20  nd its variants 
201f0 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69  fail. If onoff i
20200 73 20 7a 65 72 6f 2c 20 75 6e 64 6f 20 74 68 69  s zero, undo thi
20210 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a  s setting..    *
20220 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
20230 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
20240 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20  TIME_FAULT: {.  
20250 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
20260 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69  lConfig.bLocalti
20270 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67  meFault = va_arg
20280 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
20290 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
202a0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
202b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
202c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54  ITE_TESTCTRL_INT
202d0 45 52 4e 41 4c 5f 46 55 4e 43 53 2c 20 69 6e 74  ERNAL_FUNCS, int
202e0 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
202f0 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
20300 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
20310 2d 7a 65 72 6f 2c 20 69 6e 74 65 72 6e 61 6c 2d  -zero, internal-
20320 75 73 65 2d 6f 6e 6c 79 20 53 51 4c 20 66 75 6e  use-only SQL fun
20330 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 61 72  ctions.    ** ar
20340 65 20 76 69 73 69 62 6c 65 20 74 6f 20 6f 72 64  e visible to ord
20350 69 6e 61 72 79 20 53 51 4c 2e 20 20 54 68 69 73  inary SQL.  This
20360 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 74   is useful for t
20370 65 73 74 69 6e 67 20 62 75 74 20 69 73 0a 20 20  esting but is.  
20380 20 20 2a 2a 20 75 6e 73 61 66 65 20 62 65 63 61    ** unsafe beca
20390 75 73 65 20 69 6e 76 61 6c 69 64 20 70 61 72 61  use invalid para
203a0 6d 65 74 65 72 73 20 74 6f 20 74 68 6f 73 65 20  meters to those 
203b0 69 6e 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c  internal-use-onl
203c0 79 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  y functions.    
203d0 2a 2a 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  ** can result in
203e0 20 63 72 61 73 68 65 73 20 6f 72 20 73 65 67 66   crashes or segf
203f0 61 75 6c 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  aults..    */.  
20400 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
20410 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f  STCTRL_INTERNAL_
20420 46 55 4e 43 54 49 4f 4e 53 3a 20 7b 0a 20 20 20  FUNCTIONS: {.   
20430 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
20440 43 6f 6e 66 69 67 2e 62 49 6e 74 65 72 6e 61 6c  Config.bInternal
20450 46 75 6e 63 74 69 6f 6e 73 20 3d 20 76 61 5f 61  Functions = va_a
20460 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
20470 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20480 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
20490 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
204a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
204b0 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e  EVER_CORRUPT, in
204c0 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
204d0 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
204e0 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
204f0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61  ates that the da
20500 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61  tabase file is a
20510 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20  lways well-.    
20520 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65  ** formed and ne
20530 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68  ver corrupt.  Th
20540 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  is flag is clear
20550 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64   by default, ind
20560 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20  icating that.   
20570 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
20580 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72  es might have ar
20590 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69  bitrary corrupti
205a0 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  on.  Setting the
205b0 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20   flag during.   
205c0 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73   ** testing caus
205d0 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72  es certain asser
205e0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
205f0 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65  n the code to be
20600 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a   activated.    *
20610 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61  * that demonstra
20620 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20  t invariants on 
20630 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
20640 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  base files..    
20650 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
20660 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
20670 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20  R_CORRUPT: {.   
20680 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
20690 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72  Config.neverCorr
206a0 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  upt = va_arg(ap,
206b0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
206c0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
206d0 2a 20 53 65 74 20 74 68 65 20 74 68 72 65 73 68  * Set the thresh
206e0 6f 6c 64 20 61 74 20 77 68 69 63 68 20 4f 50 5f  old at which OP_
206f0 4f 6e 63 65 20 63 6f 75 6e 74 65 72 73 20 72 65  Once counters re
20700 73 65 74 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f  set back to zero
20710 2e 0a 20 20 20 20 2a 2a 20 42 79 20 64 65 66 61  ..    ** By defa
20720 75 6c 74 20 74 68 69 73 20 69 73 20 30 78 37 66  ult this is 0x7f
20730 66 66 66 66 66 65 20 28 6f 76 65 72 20 32 20 62  fffffe (over 2 b
20740 69 6c 6c 69 6f 6e 29 2c 20 62 75 74 20 74 68 61  illion), but tha
20750 74 20 76 61 6c 75 65 20 69 73 0a 20 20 20 20 2a  t value is.    *
20760 2a 20 74 6f 6f 20 62 69 67 20 74 6f 20 74 65 73  * too big to tes
20770 74 20 69 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c  t in a reasonabl
20780 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
20790 2c 20 73 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f  , so this contro
207a0 6c 20 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76  l is.    ** prov
207b0 69 64 65 64 20 74 6f 20 73 65 74 20 61 20 73 6d  ided to set a sm
207c0 61 6c 6c 20 61 6e 64 20 65 61 73 69 6c 79 20 72  all and easily r
207d0 65 61 63 68 61 62 6c 65 20 72 65 73 65 74 20 76  eachable reset v
207e0 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
207f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
20800 54 43 54 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54  TCTRL_ONCE_RESET
20810 5f 54 48 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20  _THRESHOLD: {.  
20820 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
20830 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73  lConfig.iOnceRes
20840 65 74 54 68 72 65 73 68 6f 6c 64 20 3d 20 76 61  etThreshold = va
20850 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
20860 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20870 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
20880 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
20890 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
208a0 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20  _VDBE_COVERAGE, 
208b0 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b  xCallback, ptr);
208c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
208d0 65 74 20 74 68 65 20 56 44 42 45 20 63 6f 76 65  et the VDBE cove
208e0 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75  rage callback fu
208f0 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62  nction to xCallb
20900 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74  ack with context
20910 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72   .    ** pointer
20920 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   ptr..    */.   
20930 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
20940 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52  TCTRL_VDBE_COVER
20950 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  AGE: {.#ifdef SQ
20960 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
20970 47 45 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  GE.      typedef
20980 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63   void (*branch_c
20990 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 75  allback)(void*,u
209a0 6e 73 69 67 6e 65 64 20 69 6e 74 2c 0a 20 20 20  nsigned int,.   
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
209e0 2c 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 3b  ,unsigned char);
209f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
20a00 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65  obalConfig.xVdbe
20a10 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28  Branch = va_arg(
20a20 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61  ap,branch_callba
20a30 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ck);.      sqlit
20a40 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
20a50 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20  VdbeBranchArg = 
20a60 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29  va_arg(ap,void*)
20a70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  ;.#endif.      b
20a80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
20a90 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
20aa0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
20ab0 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
20ac0 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78  R_MMAP, db, nMax
20ad0 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ); */.    case S
20ae0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
20af0 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20  ORTER_MMAP: {.  
20b00 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
20b10 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
20b20 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
20b30 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
20b40 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
20b50 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
20b60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
20b70 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
20b80 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
20b90 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20  TCTRL_ISINIT);. 
20ba0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74     **.    ** Ret
20bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
20bc0 20 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e   SQLite has been
20bd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
20be0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
20bf0 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20  .    ** not..   
20c00 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
20c10 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
20c20 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NIT: {.      if(
20c30 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20c40 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29  nfig.isInit==0 )
20c50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
20c60 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
20c70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
20c80 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
20c90 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
20ca0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64  CTRL_IMPOSTER, d
20cb0 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66  b, dbName, onOff
20cc0 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a  , tnum);.    **.
20cd0 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
20ce0 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64   control is used
20cf0 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73   to create impos
20d00 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62  ter tables.  "db
20d10 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20  " is a pointer. 
20d20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74     ** to the dat
20d30 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
20d40 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65  .  dbName is the
20d50 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28   database name (
20d60 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20  ex: "main" or.  
20d70 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69    ** "temp") whi
20d80 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20  ch will receive 
20d90 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22  the imposter.  "
20da0 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70  onOff" turns imp
20db0 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20  oster mode on.  
20dc0 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74    ** or off.  "t
20dd0 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74  num" is the root
20de0 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
20df0 72 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ree to which the
20e00 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a   imposter.    **
20e10 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f   table should co
20e20 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  nnect..    **.  
20e30 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f    ** Enable impo
20e40 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77  ster mode only w
20e50 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68  hen the schema h
20e60 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
20e70 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20  parsed.  Then.  
20e80 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c    ** run a singl
20e90 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
20ea0 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73  tatement to cons
20eb0 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74  truct the impost
20ec0 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20  er table in.    
20ed0 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63  ** the parsed sc
20ee0 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e  hema.  Then turn
20ef0 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62   imposter mode b
20f00 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20  ack off again.. 
20f10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
20f20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75  onOff==0 and tnu
20f30 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  m>0 then reset t
20f40 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c  he schema for al
20f50 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75  l databases, cau
20f60 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  sing.    ** the 
20f70 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70  schema to be rep
20f80 61 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74  arsed the next t
20f90 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64  ime it is needed
20fa0 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a  .  This has the.
20fb0 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66      ** effect of
20fc0 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70   erasing all imp
20fd0 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20  oster tables..  
20fe0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
20ff0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
21000 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  POSTER: {.      
21010 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
21020 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
21030 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
21040 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
21050 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
21060 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73  db->init.iDb = s
21070 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
21080 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63  (db, va_arg(ap,c
21090 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20  onst char*));.  
210a0 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
210b0 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  y = db->init.imp
210c0 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f  osterTable = va_
210d0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
210e0 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54     db->init.newT
210f0 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  num = va_arg(ap,
21100 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  int);.      if( 
21110 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
21120 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
21130 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  Tnum>0 ){.      
21140 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
21150 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
21160 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20  tion(db);.      
21170 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
21180 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
21190 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
211a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
211b0 64 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41  defined(YYCOVERA
211c0 47 45 29 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69  GE).    /*  sqli
211d0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
211e0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
211f0 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45  _PARSER_COVERAGE
21200 2c 20 46 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20  , FILE *out).   
21210 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
21220 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e  test control (on
21230 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68 65  ly available whe
21240 6e 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  n SQLite is comp
21250 69 6c 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  iled with.    **
21260 20 2d 44 59 59 43 4f 56 45 52 41 47 45 29 20 77   -DYYCOVERAGE) w
21270 72 69 74 65 73 20 61 20 72 65 70 6f 72 74 20 6f  rites a report o
21280 6e 74 6f 20 22 6f 75 74 22 20 74 68 61 74 20 73  nto "out" that s
21290 68 6f 77 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  hows all.    ** 
212a0 73 74 61 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20  state/lookahead 
212b0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20  combinations in 
212c0 74 68 65 20 70 61 72 73 65 72 20 73 74 61 74 65  the parser state
212d0 20 6d 61 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20   machine.    ** 
212e0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
212f0 65 78 65 72 63 69 73 65 64 2e 20 20 49 66 20 61  exercised.  If a
21300 6e 79 20 73 74 61 74 65 20 69 73 20 6d 69 73 73  ny state is miss
21310 65 64 2c 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  ed, make the.   
21320 20 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 20   ** return code 
21330 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
21340 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
21350 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
21360 52 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b  RSER_COVERAGE: {
21370 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  .      FILE *out
21380 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 46 49   = va_arg(ap, FI
21390 4c 45 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LE*);.      if( 
213a0 73 71 6c 69 74 65 33 50 61 72 73 65 72 43 6f 76  sqlite3ParserCov
213b0 65 72 61 67 65 28 6f 75 74 29 20 29 20 72 63 20  erage(out) ) rc 
213c0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
213d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
213e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   }.#endif /* def
213f0 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45 29  ined(YYCOVERAGE)
21400 20 2a 2f 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64   */.  }.  va_end
21410 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
21420 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c  SQLITE_UNTESTABL
21430 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  E */.  return rc
21440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
21450 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
21460 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
21470 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
21480 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
21490 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
214a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
214b0 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
214c0 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
214d0 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
214e0 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
214f0 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
21500 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
21510 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
21520 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
21530 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
21540 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
21550 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
21560 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
21570 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
21580 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
21590 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
215a0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
215b0 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
215c0 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
215d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
215e0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
215f0 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
21600 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
21610 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
21620 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
21630 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
21640 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
21650 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
21660 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
21670 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
21680 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
21690 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
216a0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
216b0 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
216c0 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d  me==0 || zParam=
216d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
216e0 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
216f0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
21700 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
21710 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65  while( zFilename
21720 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  [0] ){.    int x
21730 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e   = strcmp(zFilen
21740 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
21750 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
21760 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
21770 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
21780 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65     if( x==0 ) re
21790 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
217a0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d      zFilename +=
217b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
217c0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
217d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
217e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
217f0 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
21800 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
21810 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ameter..*/.int s
21820 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
21830 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  an(const char *z
21840 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
21850 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e  char *zParam, in
21860 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73  t bDflt){.  cons
21870 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
21880 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
21890 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
218a0 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20  ram);.  bDflt = 
218b0 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75  bDflt!=0;.  retu
218c0 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65  rn z ? sqlite3Ge
218d0 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c  tBoolean(z, bDfl
218e0 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  t) : bDflt;.}../
218f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34  *.** Return a 64
21900 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
21910 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70  ue for a query p
21920 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c  arameter..*/.sql
21930 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
21940 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20  e3_uri_int64(.  
21950 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
21960 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c  ename,    /* Fil
21970 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20  ename as passed 
21980 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f  to xOpen */.  co
21990 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
219a0 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70  ,       /* URI p
219b0 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20  arameter sought 
219c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
219d0 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f  64 bDflt       /
219e0 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61  * return if para
219f0 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67  meter is missing
21a00 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
21a10 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
21a20 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
21a30 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
21a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  );.  sqlite3_int
21a50 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26  64 v;.  if( z &&
21a60 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
21a70 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 30 20  ToI64(z, &v)==0 
21a80 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
21a90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
21aa0 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
21ab0 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
21ac0 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
21ad0 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
21ae0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
21af0 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
21b00 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
21b10 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
21b20 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
21b30 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
21b40 74 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20  t iDb = zDbName 
21b50 3f 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  ? sqlite3FindDbN
21b60 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
21b70 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 69   : 0;.  return i
21b80 44 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61  Db<0 ? 0 : db->a
21b90 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a  Db[iDb].pBt;.}..
21ba0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21bb0 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
21bc0 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
21bd0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
21be0 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
21bf0 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
21c00 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
21c10 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
21c20 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
21c30 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
21c40 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
21c50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
21c60 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
21c70 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
21c80 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
21c90 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
21ca0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
21cb0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
21cc0 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
21cd0 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
21ce0 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
21cf0 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
21d00 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
21d10 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a  me(pBt) : 0;.}..
21d20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
21d30 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  f database is re
21d40 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20  ad-only or 0 if 
21d50 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74  read/write.  Ret
21d60 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20  urn -1 if.** no 
21d70 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78  such database ex
21d80 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
21d90 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
21da0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
21db0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
21dc0 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
21dd0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21de0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
21df0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
21e00 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
21e10 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
21e20 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
21e30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
21e40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42  .  }.#endif.  pB
21e50 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
21e60 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
21e70 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
21e80 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
21e90 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74  eeIsReadonly(pBt
21ea0 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65  ) : -1;.}..#ifde
21eb0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
21ec0 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f  SNAPSHOT./*.** O
21ed0 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f 74  btain a snapshot
21ee0 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
21ef0 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74 61  snapshot of data
21f00 62 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e 74  base zDb current
21f10 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61  ly .** being rea
21f20 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a  d by handle db..
21f30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
21f40 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 73  napshot_get(.  s
21f50 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
21f60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a  onst char *zDb,.
21f70 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
21f80 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a  ot **ppSnapshot.
21f90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
21fa0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e  LITE_ERROR;.#ifn
21fb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21fc0 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
21fd0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
21fe0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
21ff0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
22000 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
22010 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
22020 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
22030 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
22040 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
22050 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 61 75  );..  if( db->au
22060 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20  toCommit==0 ){. 
22070 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
22080 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
22090 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
220a0 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31   iDb==0 || iDb>1
220b0 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20   ){.      Btree 
220c0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
220d0 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  Db].pBt;.      i
220e0 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
220f0 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
22100 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22110 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
22120 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20  inTrans(pBt, 0, 
22130 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
22140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22150 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22160 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
22170 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42  shotGet(sqlite3B
22180 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
22190 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20  ppSnapshot);.   
221a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
221b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
221c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
221d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
221e0 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
221f0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
22200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22210 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61   Open a read-tra
22220 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
22230 73 6e 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66  snapshot idendif
22240 69 65 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74  ied by pSnapshot
22250 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22260 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a  _snapshot_open(.
22270 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
22280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
22290 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  b, .  sqlite3_sn
222a0 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
222b0 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
222c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
222d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
222e0 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
222f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
22300 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
22310 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
22320 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
22330 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
22340 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
22350 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
22360 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
22370 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  ex);.  if( db->a
22380 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  utoCommit==0 ){.
22390 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
223a0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
223b0 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
223c0 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  );.    if( iDb==
223d0 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20  0 || iDb>1 ){.  
223e0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
223f0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
22400 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
22410 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
22420 6e 73 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  ns(pBt)==0 ){.  
22430 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
22440 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
22450 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
22460 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c 6f 63        int bUnloc
22470 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
22480 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
22490 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74  sInReadTrans(pBt
224a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
224b0 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
224c0 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ve==0 ){.       
224d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
224e0 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 43 68  3PagerSnapshotCh
224f0 65 63 6b 28 70 50 61 67 65 72 2c 20 70 53 6e 61  eck(pPager, pSna
22500 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pshot);.        
22510 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22520 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22530 20 20 20 20 20 20 20 62 55 6e 6c 6f 63 6b 20 3d         bUnlock =
22540 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
22550 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22560 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  reeCommit(pBt);.
22570 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
225a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
225b0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
225c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
225d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
225e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
225f0 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65  PagerSnapshotOpe
22600 6e 28 70 50 61 67 65 72 2c 20 70 53 6e 61 70 73  n(pPager, pSnaps
22610 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hot);.        }.
22620 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22640 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22650 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
22660 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  ns(pBt, 0, 0);. 
22670 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22680 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65  PagerSnapshotOpe
22690 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
226a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
226b0 69 66 28 20 62 55 6e 6c 6f 63 6b 20 29 7b 0a 20  if( bUnlock ){. 
226c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
226d0 50 61 67 65 72 53 6e 61 70 73 68 6f 74 55 6e 6c  PagerSnapshotUnl
226e0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
226f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22700 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
22710 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22720 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
22730 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
22740 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
22750 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22760 20 52 65 63 6f 76 65 72 20 61 73 20 6d 61 6e 79   Recover as many
22770 20 73 6e 61 70 73 68 6f 74 73 20 61 73 20 70 6f   snapshots as po
22780 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
22790 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  wal file associa
227a0 74 65 64 20 77 69 74 68 0a 2a 2a 20 73 63 68 65  ted with.** sche
227b0 6d 61 20 7a 44 62 20 6f 66 20 64 61 74 61 62 61  ma zDb of databa
227c0 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  se db..*/.int sq
227d0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72  lite3_snapshot_r
227e0 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33 20 2a  ecover(sqlite3 *
227f0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
22800 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  zDb){.  int rc =
22810 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
22820 20 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65   int iDb;.#ifnde
22830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
22840 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  L..#ifdef SQLITE
22850 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
22860 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
22870 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
22880 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
22890 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
228a0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
228b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
228c0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
228d0 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
228e0 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
228f0 7a 44 62 29 3b 0a 20 20 69 66 28 20 69 44 62 3d  zDb);.  if( iDb=
22900 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20  =0 || iDb>1 ){. 
22910 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
22920 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
22930 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
22940 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
22950 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  dTrans(pBt) ){. 
22960 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22970 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
22980 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
22990 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
229a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
229b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
229c0 72 53 6e 61 70 73 68 6f 74 52 65 63 6f 76 65 72  rSnapshotRecover
229d0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
229e0 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
229f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
22a00 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
22a10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
22a20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
22a30 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
22a40 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
22a50 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
22a60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22a70 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e 61 70 73  .** Free a snaps
22a80 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74 61 69  hot handle obtai
22a90 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
22aa0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 29 2e  _snapshot_get().
22ab0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22ac0 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 73  _snapshot_free(s
22ad0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
22ae0 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73  *pSnapshot){.  s
22af0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6e 61  qlite3_free(pSna
22b00 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pshot);.}.#endif
22b10 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
22b20 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23  E_SNAPSHOT */..#
22b30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22b40 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
22b50 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69 76  _DIAGS./*.** Giv
22b60 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
22b70 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
22b80 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 74 72 75  tion, return tru
22b90 65 20 69 66 20 74 68 61 74 20 6f 70 74 69 6f 6e  e if that option
22ba0 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 61 6e 64  .** was used and
22bb0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
22bc0 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20 63 61  *.** The name ca
22bd0 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67  n optionally beg
22be0 69 6e 20 77 69 74 68 20 22 53 51 4c 49 54 45 5f  in with "SQLITE_
22bf0 22 20 62 75 74 20 74 68 65 20 22 53 51 4c 49 54  " but the "SQLIT
22c00 45 5f 22 20 70 72 65 66 69 78 0a 2a 2a 20 69 73  E_" prefix.** is
22c10 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f   not required fo
22c20 72 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e  r a match..*/.in
22c30 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c  t sqlite3_compil
22c40 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e  eoption_used(con
22c50 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d  st char *zOptNam
22c60 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  e){.  int i, n;.
22c70 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f    int nOpt;.  co
22c80 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d  nst char **azCom
22c90 70 69 6c 65 4f 70 74 3b 0a 20 0a 23 69 66 20 53  pileOpt;. .#if S
22ca0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
22cb0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 7a 4f 70  _ARMOR.  if( zOp
22cc0 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tName==0 ){.    
22cd0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
22ce0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
22cf0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
22d00 69 66 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f  if..  azCompileO
22d10 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  pt = sqlite3Comp
22d20 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74  ileOptions(&nOpt
22d30 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
22d40 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61  3StrNICmp(zOptNa
22d50 6d 65 2c 20 22 53 51 4c 49 54 45 5f 22 2c 20 37  me, "SQLITE_", 7
22d60 29 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d 65 20  )==0 ) zOptName 
22d70 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  += 7;.  n = sqli
22d80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
22d90 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e  Name);..  /* Sin
22da0 63 65 20 6e 4f 70 74 20 69 73 20 6e 6f 72 6d 61  ce nOpt is norma
22db0 6c 6c 79 20 69 6e 20 73 69 6e 67 6c 65 20 64 69  lly in single di
22dc0 67 69 74 73 2c 20 61 20 6c 69 6e 65 61 72 20 73  gits, a linear s
22dd0 65 61 72 63 68 20 69 73 20 0a 20 20 2a 2a 20 61  earch is .  ** a
22de0 64 65 71 75 61 74 65 2e 20 4e 6f 20 6e 65 65 64  dequate. No need
22df0 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 73 65   for a binary se
22e00 61 72 63 68 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  arch. */.  for(i
22e10 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b 29  =0; i<nOpt; i++)
22e20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
22e30 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61  3StrNICmp(zOptNa
22e40 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  me, azCompileOpt
22e50 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  [i], n)==0.     
22e60 26 26 20 73 71 6c 69 74 65 33 49 73 49 64 43 68  && sqlite3IsIdCh
22e70 61 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ar((unsigned cha
22e80 72 29 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69  r)azCompileOpt[i
22e90 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  ][n])==0.    ){.
22ea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
22eb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22ec0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
22ed0 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 63  eturn the N-th c
22ee0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
22ef0 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49 66 20 4e  on string.  If N
22f00 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
22f10 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 4e 55  ,.** return a NU
22f20 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63  LL pointer..*/.c
22f30 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
22f40 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  e3_compileoption
22f50 5f 67 65 74 28 69 6e 74 20 4e 29 7b 0a 20 20 69  _get(int N){.  i
22f60 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74  nt nOpt;.  const
22f70 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c   char **azCompil
22f80 65 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d 70 69 6c  eOpt;.  azCompil
22f90 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  eOpt = sqlite3Co
22fa0 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f  mpileOptions(&nO
22fb0 70 74 29 3b 0a 20 20 69 66 28 20 4e 3e 3d 30 20  pt);.  if( N>=0 
22fc0 26 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20 20  && N<nOpt ){.   
22fd0 20 72 65 74 75 72 6e 20 61 7a 43 6f 6d 70 69 6c   return azCompil
22fe0 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72  eOpt[N];.  }.  r
22ff0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
23000 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
23010 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44  _COMPILEOPTION_D
23020 49 41 47 53 20 2a 2f 0a                          IAGS */.