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

Artifact dc023f468eda20aed1fb7c300673cbb40617607b5771840e4229ec239dade250:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 20 20 20 20 64 65 66 61 75  ES */..    defau
5de0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
5df0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e10: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
5e20: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
5e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
5e40: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62   the lookaside b
5e50: 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74  uffers for a dat
5e60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5e70: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
5e80: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
5e90: 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73  .  .** If lookas
5ea0: 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ide is already a
5eb0: 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51  ctive, return SQ
5ec0: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a  LITE_BUSY..**.**
5ed0: 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65   The sz paramete
5ee0: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5ef0: 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68  of bytes in each
5f00: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e   lookaside slot.
5f10: 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61  .** The cnt para
5f20: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5f30: 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49  ber of slots.  I
5f40: 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c  f pStart is NULL
5f50: 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f   the.** space fo
5f60: 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  r the lookaside 
5f70: 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e  memory is obtain
5f80: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
5f90: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20  malloc()..** If 
5fa0: 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55  pStart is not NU
5fb0: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a  LL then it is sz
5fc0: 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65  *cnt bytes of me
5fd0: 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a  mory to use for.
5fe0: 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  ** the lookaside
5ff0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
6000: 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b  ic int setupLook
6010: 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64  aside(sqlite3 *d
6020: 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  b, void *pBuf, i
6030: 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b  nt sz, int cnt){
6040: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6050: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20  OMIT_LOOKASIDE. 
6060: 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20   void *pStart;. 
6070: 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c   .  if( sqlite3L
6080: 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c  ookasideUsed(db,
6090: 30 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  0)>0 ){.    retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
60b0: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
60c0: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
60d0: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
60e0: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
60f0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
6100: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
6110: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
6120: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
6130: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
6140: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
6150: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
6160: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
6170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6180: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
6190: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
61a0: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
61b0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
61c0: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
61d0: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
61e0: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
61f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
6200: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
6210: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
6220: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
6230: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
6240: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
6250: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
6260: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
6270: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
6280: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
6290: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
62a0: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
62b0: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
62c0: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
62d0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
62e0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
62f0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
6300: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
6310: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
6320: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
6330: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
6340: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
6350: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
6360: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
6370: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
6380: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
6390: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
63a0: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
63b0: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
63c0: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
63d0: 69 64 65 2e 70 49 6e 69 74 20 3d 20 30 3b 0a 20  ide.pInit = 0;. 
63e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
63f0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
6400: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
6410: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
6420: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
6430: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
6440: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
6450: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
6460: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
6470: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 64 62 2d  lot*) );.    db-
6480: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74  >lookaside.nSlot
6490: 20 3d 20 63 6e 74 3b 0a 20 20 20 20 70 20 3d 20   = cnt;.    p = 
64a0: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
64b0: 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28  pStart;.    for(
64c0: 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69  i=cnt-1; i>=0; i
64d0: 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  --){.      p->pN
64e0: 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ext = db->lookas
64f0: 69 64 65 2e 70 49 6e 69 74 3b 0a 20 20 20 20 20  ide.pInit;.     
6500: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6510: 49 6e 69 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Init = p;.      
6520: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
6530: 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a  ot*)&((u8*)p)[sz
6540: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
6550: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
6560: 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = p;.    db->loo
6570: 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
6580: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 0;.    db->loo
6590: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
65a0: 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b   = pBuf==0 ?1:0;
65b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
65c0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
65d0: 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  rt = db;.    db-
65e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
65f0: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6600: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
6610: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
6620: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
6630: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
6640: 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d  ookaside.nSlot =
6650: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
6660: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
6670: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
6680: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
66a0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
66b0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
66c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
66d0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
66e0: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
66f0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
6700: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6710: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6720: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6730: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6740: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6750: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6760: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6770: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
6780: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
6790: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
67a0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
67b0: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
67c0: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
67d0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
67e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
67f0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6800: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6810: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
6820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6830: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6840: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6850: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6860: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6870: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6880: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6890: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
68a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
68b0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
68c0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
68d0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
68e0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
68f0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6900: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6910: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6920: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6940: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6950: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
6960: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6970: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6980: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6990: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
69a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
69c0: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
69d0: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
69e0: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
69f0: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6a00: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6a10: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
6a20: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6a30: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6a40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6a50: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
6a60: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
6a70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
6a80: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
6a90: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
6aa0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
6ab0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6ac0: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6ad0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6ae0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6af0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6b00: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6b10: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6b20: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6b40: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6b50: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6b60: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
6b70: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
6b80: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
6b90: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6ba0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6bb0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6bc0: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6bd0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6be0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6bf0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6c00: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6c10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6c20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6c30: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6c40: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6c50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6c60: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6c70: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6c80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6c90: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6ca0: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6cc0: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6cd0: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6ce0: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6cf0: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6d00: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6d10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6d20: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6d30: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6d40: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6d50: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6d60: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6d70: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6d80: 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20  MAINDBNAME: {.  
6d90: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36      /* IMP: R-06
6da0: 38 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20  824-28531 */.   
6db0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32     /* IMP: R-362
6dc0: 35 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20 20 20  57-52125 */.    
6dd0: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62    db->aDb[0].zDb
6de0: 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61  SName = va_arg(a
6df0: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  p,char*);.      
6e00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6e20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
6e30: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  TE_DBCONFIG_LOOK
6e40: 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76  ASIDE: {.      v
6e50: 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61  oid *pBuf = va_a
6e60: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f  rg(ap, void*); /
6e70: 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31  * IMP: R-26835-1
6e80: 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  0964 */.      in
6e90: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
6ea0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a  , int);       /*
6eb0: 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35   IMP: R-47871-25
6ec0: 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  994 */.      int
6ed0: 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70   cnt = va_arg(ap
6ee0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20  , int);      /* 
6ef0: 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33  IMP: R-04460-533
6f00: 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  86 */.      rc =
6f10: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
6f20: 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e  db, pBuf, sz, cn
6f30: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
6f40: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6f50: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
6f60: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
6f70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70  {.        int op
6f80: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ;      /* The op
6f90: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
6fa0: 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20  u32 mask;    /* 
6fb0: 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20  Mask of the bit 
6fc0: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73  in sqlite3.flags
6fd0: 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f   to set/clear */
6fe0: 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70  .      } aFlagOp
6ff0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
7000: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7010: 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20  _ENABLE_FKEY,   
7020: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46          SQLITE_F
7030: 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c  oreignKeys    },
7040: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7050: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7060: 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20 20  E_TRIGGER,      
7070: 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54    SQLITE_EnableT
7080: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
7090: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
70a0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33  NFIG_ENABLE_FTS3
70b0: 5f 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49  _TOKENIZER, SQLI
70c0: 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
70d0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
70e0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
70f0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
7100: 53 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61  SION, SQLITE_Loa
7110: 64 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20  dExtension  },. 
7120: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7130: 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
7140: 5f 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20  _ON_CLOSE,      
7150: 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43  SQLITE_NoCkptOnC
7160: 6c 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20  lose  },.       
7170: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7180: 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20  IG_ENABLE_QPSG, 
7190: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
71a0: 5f 45 6e 61 62 6c 65 51 50 53 47 20 20 20 20 20  _EnableQPSG     
71b0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
71c0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
71d0: 47 47 45 52 5f 45 51 50 2c 20 20 20 20 20 20 20  GGER_EQP,       
71e0: 20 20 20 20 53 51 4c 49 54 45 5f 54 72 69 67 67      SQLITE_Trigg
71f0: 65 72 45 51 50 20 20 20 20 20 7d 2c 0a 20 20 20  erEQP     },.   
7200: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7210: 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54  CONFIG_RESET_DAT
7220: 41 42 41 53 45 2c 20 20 20 20 20 20 20 20 53 51  ABASE,        SQ
7230: 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61  LITE_ResetDataba
7240: 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  se  },.      };.
7250: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
7260: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
7270: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
7280: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
7290: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
72a0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
72b0: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
72c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
72d0: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
72e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
72f0: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
7300: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
7310: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
7320: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
7330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  );.          u32
7340: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
7350: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
7360: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
7370: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7380: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
7390: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
73a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
73b0: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
73c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
73d0: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
73e0: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
73f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
7400: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
7410: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
7420: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
7430: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
7440: 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
7450: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7460: 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20  if( pRes ){.    
7470: 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
7480: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c  (db->flags & aFl
7490: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30  agOp[i].mask)!=0
74a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
74b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
74c0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
74d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
74e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
74f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7500: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
7510: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7520: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
7530: 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72  ue if the buffer
7540: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61   z[0..n-1] conta
7550: 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a  ins all spaces..
7560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
7570: 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68  lSpaces(const ch
7580: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
7590: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
75a0: 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d  [n-1]==' ' ){ n-
75b0: 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d  -; }.  return n=
75c0: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  =0;.}../*.** Thi
75d0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
75e0: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
75f0: 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52  ion named "BINAR
7600: 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  Y" which is alwa
7610: 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  ys.** available.
7620: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
7630: 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  dFlag argument i
7640: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
7650: 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74  space padding at
7660: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73   the end.** of s
7670: 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65  trings is ignore
7680: 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65  d.  This impleme
7690: 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f  nts the RTRIM co
76a0: 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  llation..*/.stat
76b0: 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75  ic int binCollFu
76c0: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46  nc(.  void *padF
76d0: 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  lag,.  int nKey1
76e0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
76f0: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
7700: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
7710: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
7720: 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
7730: 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
7740: 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44  nKey2;.  /* EVID
7750: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33  ENCE-OF: R-65033
7760: 2d 32 38 34 34 39 20 54 68 65 20 62 75 69 6c 74  -28449 The built
7770: 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  -in BINARY colla
7780: 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20  tion compares.  
7790: 2a 2a 20 73 74 72 69 6e 67 73 20 62 79 74 65 20  ** strings byte 
77a0: 62 79 20 62 79 74 65 20 75 73 69 6e 67 20 74 68  by byte using th
77b0: 65 20 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74  e memcmp() funct
77c0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ion from the sta
77d0: 6e 64 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62  ndard C.  ** lib
77e0: 72 61 72 79 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rary. */.  asser
77f0: 74 28 20 70 4b 65 79 31 20 26 26 20 70 4b 65 79  t( pKey1 && pKey
7800: 32 20 29 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  2 );.  rc = memc
7810: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
7820: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
7830: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46   ){.    if( padF
7840: 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  lag.     && allS
7850: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
7860: 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29  ey1)+n, nKey1-n)
7870: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
7880: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32  es(((char*)pKey2
7890: 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20  )+n, nKey2-n).  
78a0: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56    ){.      /* EV
78b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36  IDENCE-OF: R-316
78c0: 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20 69  24-24737 RTRIM i
78d0: 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65 78  s like BINARY ex
78e0: 63 65 70 74 20 74 68 61 74 20 65 78 74 72 61 0a  cept that extra.
78f0: 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73 20        ** spaces 
7900: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 69  at the end of ei
7910: 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20 6e  ther string do n
7920: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 72 65  ot change the re
7930: 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20  sult. In other. 
7940: 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73       ** words, s
7950: 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70  trings will comp
7960: 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65  are equal to one
7970: 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67   another as long
7980: 20 61 73 20 74 68 65 79 0a 20 20 20 20 20 20 2a   as they.      *
7990: 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e  * differ only in
79a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
79b0: 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64  paces at the end
79c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
79d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
79e0: 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
79f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7a00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7a10: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 43  Return true if C
7a20: 6f 6c 6c 53 65 71 20 69 73 20 74 68 65 20 64 65  ollSeq is the de
7a30: 66 61 75 6c 74 20 62 75 69 6c 74 2d 69 6e 20 42  fault built-in B
7a40: 49 4e 41 52 59 2e 0a 2a 2f 0a 69 6e 74 20 73 71  INARY..*/.int sq
7a50: 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 63 6f  lite3IsBinary(co
7a60: 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 29 7b  nst CollSeq *p){
7a70: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7a80: 7c 7c 20 70 2d 3e 78 43 6d 70 21 3d 62 69 6e 43  || p->xCmp!=binC
7a90: 6f 6c 6c 46 75 6e 63 20 7c 7c 20 70 2d 3e 70 55  ollFunc || p->pU
7aa0: 73 65 72 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ser!=0.         
7ab0: 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 2d 3e     || strcmp(p->
7ac0: 7a 4e 61 6d 65 2c 22 42 49 4e 41 52 59 22 29 3d  zName,"BINARY")=
7ad0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
7ae0: 3d 3d 30 20 7c 7c 20 28 70 2d 3e 78 43 6d 70 3d  ==0 || (p->xCmp=
7af0: 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 26 26 20  =binCollFunc && 
7b00: 70 2d 3e 70 55 73 65 72 3d 3d 30 29 3b 0a 7d 0a  p->pUser==0);.}.
7b10: 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62  ./*.** Another b
7b20: 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
7b30: 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41  g sequence: NOCA
7b40: 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SE. .**.** This 
7b50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7b60: 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ce is intended t
7b70: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63  o be used for "c
7b80: 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a  ase independent.
7b90: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20  ** comparison". 
7ba0: 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64  SQLite's knowled
7bb0: 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20  ge of upper and 
7bc0: 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76  lower case equiv
7bd0: 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64  alents.** extend
7be0: 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36  s only to the 26
7bf0: 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64   characters used
7c00: 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20   in the English 
7c10: 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  language..**.** 
7c20: 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68  At the moment th
7c30: 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54  ere is only a UT
7c40: 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  F-8 implementati
7c50: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
7c60: 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  t nocaseCollatin
7c70: 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  gFunc(.  void *N
7c80: 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
7c90: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
7ca0: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
7cb0: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
7cc0: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
7cd0: 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49  r = sqlite3StrNI
7ce0: 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73  Cmp(.      (cons
7cf0: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20  t char *)pKey1, 
7d00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b  (const char *)pK
7d10: 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79  ey2, (nKey1<nKey
7d20: 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b  2)?nKey1:nKey2);
7d30: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7d40: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
7d50: 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20  if( 0==r ){.    
7d60: 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b  r = nKey1-nKey2;
7d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
7d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7d90: 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68   the ROWID of th
7da0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e  e most recent in
7db0: 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69  sert.*/.sqlite_i
7dc0: 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73  nt64 sqlite3_las
7dd0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
7de0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
7df0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7e00: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
7e10: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
7e20: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
7e30: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
7e40: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
7e50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
7e60: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64  endif.  return d
7e70: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a  b->lastRowid;.}.
7e80: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
7e90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7ea0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61 73   the sqlite3_las
7eb0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29  t_insert_rowid()
7ec0: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
7ed0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73  /.void sqlite3_s
7ee0: 65 74 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  et_last_insert_r
7ef0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
7f00: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
7f10: 69 52 6f 77 69 64 29 7b 0a 23 69 66 64 65 66 20  iRowid){.#ifdef 
7f20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
7f30: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
7f40: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
7f50: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
7f60: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
7f70: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
7f80: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
7f90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7fa0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
7fb0: 3b 0a 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  ;.  db->lastRowi
7fc0: 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 73 71  d = iRowid;.  sq
7fd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7fe0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
7ff0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8000: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
8010: 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20  ges in the most 
8020: 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73  recent call to s
8030: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a  qlite3_exec()..*
8040: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68  /.int sqlite3_ch
8050: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
8060: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
8070: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
8080: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
8090: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
80a0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
80b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
80c0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
80d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
80e0: 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67  eturn db->nChang
80f0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
8100: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8110: 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74   changes since t
8120: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
8130: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a  le was opened..*
8140: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  /.int sqlite3_to
8150: 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  tal_changes(sqli
8160: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
8170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
8180: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
8190: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
81a0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
81b0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
81c0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
81d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
81e0: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
81f0: 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a  nTotalChange;.}.
8200: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
8210: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
8220: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
8230: 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73  only manipulates
8240: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a   fields of the.*
8250: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
8260: 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65  e object, it doe
8270: 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20  s not close any 
8280: 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20  savepoints that 
8290: 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61  may be open.** a
82a0: 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67  t the b-tree/pag
82b0: 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69  er level..*/.voi
82c0: 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61  d sqlite3CloseSa
82d0: 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33  vepoints(sqlite3
82e0: 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20   *db){.  while( 
82f0: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29  db->pSavepoint )
8300: 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20  {.    Savepoint 
8310: 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76  *pTmp = db->pSav
8320: 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e  epoint;.    db->
8330: 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d  pSavepoint = pTm
8340: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  p->pNext;.    sq
8350: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8360: 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  pTmp);.  }.  db-
8370: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
8380: 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  .  db->nStatemen
8390: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54  t = 0;.  db->isT
83a0: 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
83b0: 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  int = 0;.}../*.*
83c0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  * Invoke the des
83d0: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
83e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
83f0: 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61   FuncDef p, if a
8400: 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69  ny. Except,.** i
8410: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
8420: 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74  e last copy of t
8430: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20  he function, do 
8440: 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d  not invoke it. M
8450: 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65  ultiple.** copie
8460: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75  s of a single fu
8470: 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74  nction are creat
8480: 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66  ed when create_f
8490: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  unction() is cal
84a0: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
84b0: 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e  TE_ANY as the en
84c0: 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  coding..*/.stati
84d0: 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44  c void functionD
84e0: 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a  estroy(sqlite3 *
84f0: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b  db, FuncDef *p){
8500: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
8510: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d  r *pDestructor =
8520: 20 70 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f   p->u.pDestructo
8530: 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75  r;.  if( pDestru
8540: 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73  ctor ){.    pDes
8550: 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b  tructor->nRef--;
8560: 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75  .    if( pDestru
8570: 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ctor->nRef==0 ){
8580: 0a 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74  .      pDestruct
8590: 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65  or->xDestroy(pDe
85a0: 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44  structor->pUserD
85b0: 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ata);.      sqli
85c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
85d0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
85e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
85f0: 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71  isconnect all sq
8600: 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63  lite3_vtab objec
8610: 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
8620: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  o database conne
8630: 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69  ction.** db. Thi
8640: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
8650: 20 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f   db is being clo
8660: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
8670: 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  oid disconnectAl
8680: 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64  lVtab(sqlite3 *d
8690: 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b){.#ifndef SQLI
86a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
86b0: 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ABLE.  int i;.  
86c0: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73  HashElem *p;.  s
86d0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
86e0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
86f0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
8700: 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20  ++){.    Schema 
8710: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
8720: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[i].pSchema;. 
8730: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
8740: 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
8750: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
8760: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
8770: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20  a->tblHash); p; 
8780: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
8790: 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (p)){.        Ta
87a0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62  ble *pTab = (Tab
87b0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
87c0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ata(p);.        
87d0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
87e0: 61 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61  ab) ) sqlite3Vta
87f0: 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  bDisconnect(db, 
8800: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTab);.      }. 
8810: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
8820: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
8830: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
8840: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
8850: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(p)){.    Mod
8860: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
8870: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
8880: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28  Data(p);.    if(
8890: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29   pMod->pEpoTab )
88a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
88b0: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
88c0: 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29  , pMod->pEpoTab)
88d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
88e0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
88f0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
8900: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
8910: 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  db);.#else.  UNU
8920: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
8930: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
8940: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8950: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  f database conne
8960: 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66  ction db has unf
8970: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
8980: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
8990: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
89a0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
89b0: 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ects.  .*/.stati
89c0: 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  c int connection
89d0: 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a  IsBusy(sqlite3 *
89e0: 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  db){.  int j;.  
89f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8a00: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
8a10: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64  utex) );.  if( d
8a20: 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72  b->pVdbe ) retur
8a30: 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  n 1;.  for(j=0; 
8a40: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
8a50: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
8a60: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74  = db->aDb[j].pBt
8a70: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  ;.    if( pBt &&
8a80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
8a90: 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72  nBackup(pBt) ) r
8aa0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
8ab0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8ac0: 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74  * Close an exist
8ad0: 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62  ing SQLite datab
8ae0: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ase.*/.static in
8af0: 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73  t sqlite3Close(s
8b00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
8b10: 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20  forceZombie){.  
8b20: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f  if( !db ){.    /
8b30: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
8b40: 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c  -63257-11740 Cal
8b50: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ling sqlite3_clo
8b60: 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  se() or.    ** s
8b70: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
8b80: 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f  ) with a NULL po
8b90: 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69  inter argument i
8ba0: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
8bb0: 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  op. */.    retur
8bc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8bd0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
8be0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
8bf0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
8c00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
8c10: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  SE_BKPT;.  }.  s
8c20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8c30: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
8c40: 20 69 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20   if( db->mTrace 
8c50: 26 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43  & SQLITE_TRACE_C
8c60: 4c 4f 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e  LOSE ){.    db->
8c70: 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52  xTrace(SQLITE_TR
8c80: 41 43 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70  ACE_CLOSE, db->p
8c90: 54 72 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29  TraceArg, db, 0)
8ca0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63  ;.  }..  /* Forc
8cb0: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61  e xDisconnect ca
8cc0: 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75  lls on all virtu
8cd0: 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64  al tables */.  d
8ce0: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
8cf0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  (db);..  /* If a
8d00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
8d10: 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e  open, the discon
8d20: 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61  nectAllVtab() ca
8d30: 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69  ll above.  ** wi
8d40: 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c  ll not have call
8d50: 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ed the xDisconne
8d60: 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61  ct() method on a
8d70: 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  ny virtual.  ** 
8d80: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62  tables in the db
8d90: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
8da0: 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  y. The following
8db0: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
8dc0: 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c  back().  ** call
8dd0: 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20   will do so. We 
8de0: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
8df0: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
8e00: 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a   for active.  **
8e10: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
8e20: 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d  below, as the v-
8e30: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
8e40: 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72  tion may be stor
8e50: 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72  ing.  ** some pr
8e60: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8e70: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  s internally..  
8e80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  */.  sqlite3Vtab
8e90: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20  Rollback(db);.. 
8ea0: 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76   /* Legacy behav
8eb0: 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f  ior (sqlite3_clo
8ec0: 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69  se() behavior) i
8ed0: 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  s to return.  **
8ee0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20   SQLITE_BUSY if 
8ef0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
8f00: 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  an not be closed
8f10: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
8f20: 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a  */.  if( !forceZ
8f30: 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74  ombie && connect
8f40: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
8f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8f60: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
8f70: 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c  ITE_BUSY, "unabl
8f80: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
8f90: 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a  o unfinalized ".
8fa0: 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e         "statemen
8fb0: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
8fc0: 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20   backups");.    
8fd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8fe0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8ff0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9000: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66  E_BUSY;.  }..#if
9010: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9020: 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
9030: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
9040: 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
9050: 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65    /* Closing the
9060: 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
9070: 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
9080: 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e  sed the value 2.
9090: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47   */.    sqlite3G
90a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
90b0: 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  log(sqlite3Globa
90c0: 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
90d0: 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20  rg, db, 0, 2);. 
90e0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
90f0: 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e  Convert the conn
9100: 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f  ection into a zo
9110: 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c  mbie and then cl
9120: 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64  ose it..  */.  d
9130: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
9140: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a  E_MAGIC_ZOMBIE;.
9150: 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75    sqlite3LeaveMu
9160: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
9170: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
9180: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9190: 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f  .** Two variatio
91a0: 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63  ns on the public
91b0: 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63   interface for c
91c0: 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  losing a databas
91d0: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
91e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f   The sqlite3_clo
91f0: 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74  se() version ret
9200: 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
9210: 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74   and.** leaves t
9220: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
9230: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
9240: 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72  e unfinalized pr
9250: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
9260: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
9270: 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ed sqlite3_backu
9280: 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ps.  The sqlite3
9290: 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76  _close_v2().** v
92a0: 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68  ersion forces th
92b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
92c0: 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20  become a zombie 
92d0: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
92e0: 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63  unclosed resourc
92f0: 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73  es, and arranges
9300: 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f   for deallocatio
9310: 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a  n when the last.
9320: 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65  ** prepare state
9330: 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f  ment or sqlite3_
9340: 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a  backup closes..*
9350: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  /.int sqlite3_cl
9360: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ose(sqlite3 *db)
9370: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
9380: 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69  Close(db,0); }.i
9390: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
93a0: 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _v2(sqlite3 *db)
93b0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
93c0: 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a  Close(db,1); }..
93d0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
93e0: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
93f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
9400: 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d  ..**.** Furtherm
9410: 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65  ore, if database
9420: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
9430: 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e  s a zombie (mean
9440: 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a  ing that there.*
9450: 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69  * has been a pri
9460: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
9470: 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20  e3_close(db) or 
9480: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
9490: 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65  (db)) and.** eve
94a0: 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ry sqlite3_stmt 
94b0: 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e  has now been fin
94c0: 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79  alized and every
94d0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
94e0: 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c  has.** finished,
94f0: 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72   then free all r
9500: 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69  esources..*/.voi
9510: 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75  d sqlite3LeaveMu
9520: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
9530: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
9540: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20    HashElem *i;  
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9560: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
9570: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  iterator */.  in
9580: 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t j;..  /* If th
9590: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
95a0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ing sqlite3_stmt
95b0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   or sqlite3_back
95c0: 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20  up objects.  ** 
95d0: 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  or if the connec
95e0: 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  tion has not yet
95f0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20   been closed by 
9600: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
9610: 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75  (),.  ** then ju
9620: 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74  st leave the mut
9630: 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ex and return.. 
9640: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
9650: 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic!=SQLITE_MAGI
9660: 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e  C_ZOMBIE || conn
9670: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29  ectionIsBusy(db)
9680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9690: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
96a0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
96b0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rn;.  }..  /* If
96c0: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
96d0: 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
96e0: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
96f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a   connection has.
9700: 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20    ** closed all 
9710: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64  sqlite3_stmt and
9720: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9730: 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20  objects and has 
9740: 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64  been.  ** passed
9750: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
9760: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
9770: 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e  it is a zombie).
9780: 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a    Therefore,.  *
9790: 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66  * go ahead and f
97a0: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
97b0: 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  s..  */..  /* If
97c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
97d0: 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20  s open, roll it 
97e0: 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20  back. This also 
97f0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a  ensures that if.
9800: 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73    ** any databas
9810: 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62  e schemas have b
9820: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20  een modified by 
9830: 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74  an uncommitted t
9840: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
9850: 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20  they are reset. 
9860: 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71  And that the req
9870: 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  uired b-tree mut
9880: 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61  ex is held to ma
9890: 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ke.  ** the page
98a0: 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
98b0: 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61  chema reset an a
98c0: 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e  tomic operation.
98d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c   */.  sqlite3Rol
98e0: 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
98f0: 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46  ITE_OK);..  /* F
9900: 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  ree any outstand
9910: 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74  ing Savepoint st
9920: 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73  ructures. */.  s
9930: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
9940: 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a  oints(db);..  /*
9950: 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62   Close all datab
9960: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
9970: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
9980: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
9990: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
99a0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b  b = &db->aDb[j];
99b0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
99c0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
99d0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
99e0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44  ->pBt);.      pD
99f0: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20  b->pBt = 0;.    
9a00: 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20    if( j!=1 ){.  
9a10: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
9a20: 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ma = 0;.      }.
9a30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43      }.  }.  /* C
9a40: 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73 63  lear the TEMP sc
9a50: 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20  hema separately 
9a60: 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66  and last */.  if
9a70: 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
9a80: 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69  hema ){.    sqli
9a90: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64  te3SchemaClear(d
9aa0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9ab0: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
9ac0: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
9ad0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  db);..  /* Free 
9ae0: 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  up the array of 
9af0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
9b00: 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ses */.  sqlite3
9b10: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
9b20: 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73  Array(db);.  ass
9b30: 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20  ert( db->nDb<=2 
9b40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
9b50: 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb==db->aDbSta
9b60: 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c  tic );..  /* Tel
9b70: 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f  l the code in no
9b80: 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65 20  tify.c that the 
9b90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f  connection no lo
9ba0: 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20  nger holds any. 
9bb0: 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f   ** locks and do
9bc0: 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
9bd0: 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63  ny further unloc
9be0: 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
9bf0: 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ks..  */.  sqlit
9c00: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73  e3ConnectionClos
9c10: 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69  ed(db);..  for(i
9c20: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9c30: 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b  (&db->aFunc); i;
9c40: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
9c50: 74 28 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44  t(i)){.    FuncD
9c60: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20  ef *pNext, *p;. 
9c70: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73     p = sqliteHas
9c80: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 64 6f  hData(i);.    do
9c90: 7b 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  {.      function
9ca0: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
9cb0: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
9cc0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
9cd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9ce0: 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4e  p);.      p = pN
9cf0: 65 78 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ext;.    }while(
9d00: 20 70 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   p );.  }.  sqli
9d10: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
9d20: 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28  ->aFunc);.  for(
9d30: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9d40: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
9d50: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9d60: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
9d70: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9d80: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
9d90: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
9da0: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
9db0: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
9dc0: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
9dd0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
9de0: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
9df0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
9e00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
9e10: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
9e20: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
9e30: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
9e40: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
9e50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
9e60: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
9e70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
9e80: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
9e90: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
9ea0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9eb0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
9ec0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9ed0: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
9ee0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
9ef0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
9f00: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
9f10: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
9f20: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
9f30: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
9f40: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
9f50: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
9f60: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
9f70: 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79  sqlite3VtabEpony
9f80: 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64  mousTableClear(d
9f90: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71  b, pMod);.    sq
9fa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9fb0: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
9fc0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
9fd0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
9fe0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
9ff0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
a000: 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  K); /* Deallocat
a010: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
a020: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
a030: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
a040: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
a050: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
a060: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20  nsions(db);.#if 
a070: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
a080: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c  ENTICATION.  sql
a090: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
a0a0: 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20  th.zAuthUser);. 
a0b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a0c0: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b  ->auth.zAuthPW);
a0d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
a0e0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
a0f0: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
a100: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
a110: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
a120: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
a130: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
a140: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
a150: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
a160: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
a170: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
a180: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
a190: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
a1a0: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
a1b0: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
a1c0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
a1d0: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
a1e0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
a1f0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a200: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
a210: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
a220: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
a230: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
a240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a250: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
a260: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
a270: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
a280: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
a290: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
a2a0: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
a2b0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
a2c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
a2d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 6f  sert( sqlite3Loo
a2e0: 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29  kasideUsed(db,0)
a2f0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ==0 );.  if( db-
a300: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
a310: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
a320: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
a330: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
a340: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
a350: 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(db);.}../*.**
a360: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
a370: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49  tabase files.  I
a380: 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
a390: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  t SQLITE_OK, the
a3a0: 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63  n.** any write c
a3b0: 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
a3c0: 69 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64  idated ("tripped
a3d0: 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70  " - as in "tripp
a3e0: 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a  ing a circuit.**
a3f0: 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d   breaker") and m
a400: 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72  ade to return tr
a410: 69 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20  ipCode if there 
a420: 61 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a  are any further.
a430: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
a440: 73 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20  se that cursor. 
a450: 20 52 65 61 64 20 63 75 72 73 6f 72 73 20 72 65   Read cursors re
a460: 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61  main open and va
a470: 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22  lid.** but are "
a480: 73 61 76 65 64 22 20 69 6e 20 63 61 73 65 20 74  saved" in case t
a490: 68 65 20 74 61 62 6c 65 20 70 61 67 65 73 20 61  he table pages a
a4a0: 72 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e  re moved around.
a4b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a4c0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69  RollbackAll(sqli
a4d0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69  te3 *db, int tri
a4e0: 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pCode){.  int i;
a4f0: 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d  .  int inTrans =
a500: 20 30 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61   0;.  int schema
a510: 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74  Change;.  assert
a520: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a530: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
a540: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
a550: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
a560: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c  ..  /* Obtain al
a570: 6c 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  l b-tree mutexes
a580: 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61   before making a
a590: 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65  ny calls to Btre
a5a0: 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20  eRollback(). .  
a5b0: 2a 2a 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  ** This is impor
a5c0: 74 61 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65  tant in case the
a5d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
a5e0: 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68  ng rolled back h
a5f0: 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64  as.  ** modified
a600: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
a610: 68 65 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74  hema. If the b-t
a620: 72 65 65 20 6d 75 74 65 78 65 73 20 61 72 65 20  ree mutexes are 
a630: 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68  not taken.  ** h
a640: 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65  ere, then anothe
a650: 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
a660: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20  onnection might 
a670: 73 6e 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e  sneak in between
a680: 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
a690: 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  se rollback and 
a6a0: 73 63 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68  schema reset, wh
a6b0: 69 63 68 20 63 61 6e 20 63 61 75 73 65 20 66 61  ich can cause fa
a6c0: 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74  lse.  ** corrupt
a6d0: 69 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73  ion reports in s
a6e0: 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20  ome cases.  */. 
a6f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
a700: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68  erAll(db);.  sch
a710: 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d  emaChange = (db-
a720: 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c  >mDbFlags & DBFL
a730: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 29  AG_SchemaChange)
a740: 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  !=0 && db->init.
a750: 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28  busy==0;..  for(
a760: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
a770: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
a780: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
a790: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
a7a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
a7b0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
a7c0: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
a7d0: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
a7e0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a7f0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
a800: 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63  p, tripCode, !sc
a810: 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20  hemaChange);.   
a820: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
a830: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
a840: 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
a850: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
a860: 20 69 66 28 20 73 63 68 65 6d 61 43 68 61 6e 67   if( schemaChang
a870: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
a880: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
a890: 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b  atements(db, 0);
a8a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
a8b0: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
a8c0: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
a8d0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
a8e0: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
a8f0: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
a900: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
a910: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
a920: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
a930: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
a940: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
a950: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
a960: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
a970: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
a980: 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  erFKs;..  /* If 
a990: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
a9a0: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
a9b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
a9c0: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
a9d0: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
a9e0: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
a9f0: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
aa00: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
aa10: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
aa20: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
aa30: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
aa40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
aa50: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f  static string co
aa60: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
aa70: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
aa80: 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  to the error cod
aa90: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69  e.** specified i
aaa0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
aab0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
aac0: 51 4c 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e  QLITE_NEED_ERR_N
aad0: 41 4d 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20  AME).const char 
aae0: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
aaf0: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
ab00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
ab10: 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52  ;.  int i, origR
ab20: 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  c = rc;.  for(i=
ab30: 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d  0; i<2 && zName=
ab40: 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30  =0; i++, rc &= 0
ab50: 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68  xff){.    switch
ab60: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
ab70: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
ab90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
aba0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
abb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
abc0: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
abd0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
abe0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
abf0: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
ac00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac10: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
ac20: 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20  RNAL:           
ac30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ac40: 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20  INTERNAL";      
ac50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ac60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
ac70: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
ac80: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ac90: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20  _PERM";         
aca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
acb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
acc0: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
acd0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ace0: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
acf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
ad10: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  BORT_ROLLBACK:  
ad20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad30: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
ad40: 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  K";    break;.  
ad50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ad60: 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20  BUSY:           
ad70: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ad80: 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20  ITE_BUSY";      
ad90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ada0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
adb0: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20  _BUSY_RECOVERY: 
adc0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
add0: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
ade0: 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  RY";     break;.
adf0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae00: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a  E_BUSY_SNAPSHOT:
ae10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ae20: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
ae30: 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  HOT";     break;
ae40: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ae50: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20  TE_LOCKED:      
ae60: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ae70: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
ae80: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
ae90: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aea0: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
aeb0: 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20  DCACHE: zName = 
aec0: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  "SQLITE_LOCKED_S
aed0: 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61  HAREDCACHE";brea
aee0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aef0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
af00: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
af10: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
af30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
af40: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
af50: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
af60: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
af70: 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  LY";          br
af80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
af90: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
afa0: 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65  RECOVERY:  zName
afb0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
afc0: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62  NLY_RECOVERY"; b
afd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
afe0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
aff0: 5f 43 41 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d  _CANTINIT:  zNam
b000: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b010: 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20  ONLY_CANTINIT"; 
b020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b030: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
b040: 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61  Y_ROLLBACK:  zNa
b050: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
b060: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b  DONLY_ROLLBACK";
b070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b080: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
b090: 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e  LY_DBMOVED:   zN
b0a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
b0b0: 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b  ADONLY_DBMOVED";
b0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b0d0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
b0e0: 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a  NLY_DIRECTORY: z
b0f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
b100: 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52  EADONLY_DIRECTOR
b110: 59 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  Y";break;.      
b120: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
b130: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
b140: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b150: 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20  INTERRUPT";     
b160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b170: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b180: 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR:             
b190: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b1a0: 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20  _IOERR";        
b1b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b1c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b1d0: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
b1e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b1f0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20  E_IOERR_READ";  
b200: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b210: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b220: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a  OERR_SHORT_READ:
b230: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b240: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
b250: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
b260: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b270: 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20  IOERR_WRITE:    
b280: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b290: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22  ITE_IOERR_WRITE"
b2a0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b2b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b2c0: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20  _IOERR_FSYNC:   
b2d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b2e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
b2f0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b300: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b310: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
b320: 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  C:    zName = "S
b330: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
b340: 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b  FSYNC";   break;
b350: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b360: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
b370: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
b380: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
b390: 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b  NCATE";    break
b3a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b3b0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a  ITE_IOERR_FSTAT:
b3c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b3d0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
b3e0: 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61  TAT";       brea
b3f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b400: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
b410: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
b420: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55   "SQLITE_IOERR_U
b430: 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  NLOCK";      bre
b440: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b450: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
b460: 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  CK:       zName 
b470: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b480: 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72  RDLOCK";      br
b490: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b4a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
b4b0: 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ETE:       zName
b4c0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b4d0: 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62  _DELETE";      b
b4e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b4f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
b500: 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  MEM:        zNam
b510: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b520: 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  R_NOMEM";       
b530: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b540: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
b550: 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61  CCESS:       zNa
b560: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b570: 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20  RR_ACCESS";     
b580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b590: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b5a0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
b5b0: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b5e0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
b5f0: 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65  SERVEDLOCK"; bre
b600: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b610: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
b620: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
b630: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b640: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72  LOCK";        br
b650: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b660: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
b670: 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  SE:        zName
b680: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b690: 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62  _CLOSE";       b
b6a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b6b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
b6c0: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d  R_CLOSE:    zNam
b6d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b6e0: 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20  R_DIR_CLOSE";   
b6f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b700: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b710: 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61  HMOPEN:      zNa
b720: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b730: 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20  RR_SHMOPEN";    
b740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b750: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b760: 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e  SHMSIZE:      zN
b770: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b780: 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20  ERR_SHMSIZE";   
b790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b7a0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b7b0: 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a  _SHMLOCK:      z
b7c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b7d0: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20  OERR_SHMLOCK";  
b7e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b7f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b800: 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20  R_SHMMAP:       
b810: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b820: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20  IOERR_SHMMAP";  
b830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b840: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b850: 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20  RR_SEEK:        
b860: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b870: 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20  _IOERR_SEEK";   
b880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b890: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b8a0: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
b8b0: 3a 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 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
b8d0: 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20  OENT";break;.   
b8e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b8f0: 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20  OERR_MMAP:      
b900: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b910: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20  TE_IOERR_MMAP"; 
b920: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b930: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b940: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
b950: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
b960: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
b970: 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  PPATH"; break;. 
b980: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b990: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a  _IOERR_CONVPATH:
b9a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b9b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
b9c0: 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATH";    break;.
b9d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b9e0: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20  E_CORRUPT:      
b9f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ba00: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
ba10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ba20: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ba30: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a  TE_CORRUPT_VTAB:
ba40: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ba50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
ba60: 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  TAB";      break
ba70: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ba80: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20  ITE_NOTFOUND:   
ba90: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
baa0: 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  "SQLITE_NOTFOUND
bab0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
bac0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bad0: 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
bae0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
baf0: 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20   "SQLITE_FULL"; 
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
bb10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb20: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
bb30: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bb40: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
bb50: 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  EN";          br
bb60: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bb70: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bb80: 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65  NOTEMPDIR: zName
bb90: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
bba0: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62  PEN_NOTEMPDIR";b
bbb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bbc0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bbd0: 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d  _ISDIR:     zNam
bbe0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bbf0: 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20  OPEN_ISDIR";    
bc00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc10: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
bc20: 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61  N_FULLPATH:  zNa
bc30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
bc40: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b  TOPEN_FULLPATH";
bc50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bc60: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
bc70: 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e  EN_CONVPATH:  zN
bc80: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
bc90: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22  NTOPEN_CONVPATH"
bca0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
bcb0: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ase SQLITE_PROTO
bcc0: 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  COL:           z
bcd0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
bce0: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20  ROTOCOL";       
bcf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd00: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
bd10: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
bd20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd30: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20  EMPTY";         
bd40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bd50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48   case SQLITE_SCH
bd60: 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20  EMA:            
bd70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bd80: 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20  _SCHEMA";       
bd90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bda0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
bdb0: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
bdc0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bdd0: 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20  E_TOOBIG";      
bde0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bdf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
be00: 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20  ONSTRAINT:      
be10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
be20: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
be30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
be40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
be50: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
be60: 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  E:  zName = "SQL
be70: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
be80: 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20  NIQUE"; break;. 
be90: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bea0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
beb0: 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  GER: zName = "SQ
bec0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bed0: 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a  TRIGGER";break;.
bee0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bef0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
bf00: 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20  EIGNKEY:.       
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bf30: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bf40: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b  INT_FOREIGNKEY";
bf50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bf60: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bf70: 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20  TRAINT_CHECK:   
bf80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bf90: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
bfa0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
bfb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bfc0: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
bfd0: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c000: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
c010: 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72  RIMARYKEY";   br
c020: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c030: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c040: 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65  T_NOTNULL: zName
c050: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
c060: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62  RAINT_NOTNULL";b
c070: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c080: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c090: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20  NT_COMMITHOOK:. 
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c0c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c0d0: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
c0e0: 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a  HOOK";   break;.
c0f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c100: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
c110: 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  B:    zName = "S
c120: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c130: 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b  _VTAB";   break;
c140: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c150: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
c160: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20  NCTION:.        
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c190: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
c1a0: 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20  NT_FUNCTION";   
c1b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c1c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c1d0: 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a  RAINT_ROWID:   z
c1e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c1f0: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22  ONSTRAINT_ROWID"
c200: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
c210: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
c220: 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20  ATCH:           
c230: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c240: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20  MISMATCH";      
c250: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c260: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
c270: 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  USE:            
c280: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c290: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20  _MISUSE";       
c2a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c2b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c2c0: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
c2d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c2e0: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
c2f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c300: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
c310: 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  UTH:            
c320: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c330: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
c340: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c360: 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20  FORMAT:         
c370: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c380: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
c390: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c3a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c3b0: 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20  _RANGE:         
c3c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c3d0: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
c3e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c3f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c400: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
c410: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c420: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
c430: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c440: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c450: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20  TE_ROW:         
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 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
c480: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c490: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c4a0: 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20  ITE_NOTICE:     
c4b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c4c0: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b  "SQLITE_NOTICE";
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c4e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c4f0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c500: 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d  VER_WAL: zName =
c510: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
c520: 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65  RECOVER_WAL";bre
c530: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c540: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
c550: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20  OVER_ROLLBACK:. 
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c580: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c590: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
c5a0: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
c5b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c5c0: 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20  E_WARNING:      
c5d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c5e0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20  QLITE_WARNING"; 
c5f0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c600: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c610: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
c620: 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  NDEX:  zName = "
c630: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
c640: 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  UTOINDEX"; break
c650: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c660: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
c670: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c680: 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20  "SQLITE_DONE";  
c690: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c6a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
c6b0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
c6c0: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
c6d0: 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
c6e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
c6f0: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
c700: 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57  , "SQLITE_UNKNOW
c710: 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b  N(%d)", origRc);
c720: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75  .    zName = zBu
c730: 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  f;.  }.  return 
c740: 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
c750: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
c760: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
c770: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
c780: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
c790: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
c7a0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
c7b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
c7c0: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
c7d0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
c7e0: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
c7f0: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
c800: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
c810: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
c820: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c830: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
c840: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
c850: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c860: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20  ITE_INTERNAL    
c870: 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  */ 0,.    /* SQL
c880: 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20  ITE_PERM        
c890: 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69  */ "access permi
c8a0: 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ssion denied",. 
c8b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f     /* SQLITE_ABO
c8c0: 52 54 20 20 20 20 20 20 20 2a 2f 20 22 71 75 65  RT       */ "que
c8d0: 72 79 20 61 62 6f 72 74 65 64 22 2c 0a 20 20 20  ry aborted",.   
c8e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
c8f0: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
c900: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
c910: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
c920: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
c930: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
c940: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
c950: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
c960: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
c970: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
c980: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
c990: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
c9a0: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
c9b0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
c9c0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
c9d0: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
c9e0: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
c9f0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
ca00: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
ca10: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
ca20: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
ca30: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
ca40: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
ca50: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
ca60: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
ca70: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
ca80: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
ca90: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
caa0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
cab0: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
cac0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cad0: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
cae0: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
caf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
cb00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
cb10: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
cb20: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
cb30: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
cb40: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 30 2c  MPTY       */ 0,
cb50: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53  .    /* SQLITE_S
cb60: 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64  CHEMA      */ "d
cb70: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
cb80: 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20  as changed",.   
cb90: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49   /* SQLITE_TOOBI
cba0: 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e  G      */ "strin
cbb0: 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69  g or blob too bi
cbc0: 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  g",.    /* SQLIT
cbd0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f  E_CONSTRAINT  */
cbe0: 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69   "constraint fai
cbf0: 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  led",.    /* SQL
cc00: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20  ITE_MISMATCH    
cc10: 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73  */ "datatype mis
cc20: 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53  match",.    /* S
cc30: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20  QLITE_MISUSE    
cc40: 20 20 2a 2f 20 22 62 61 64 20 70 61 72 61 6d 65    */ "bad parame
cc50: 74 65 72 20 6f 72 20 6f 74 68 65 72 20 41 50 49  ter or other API
cc60: 20 6d 69 73 75 73 65 22 2c 0a 23 69 66 64 65 66   misuse",.#ifdef
cc70: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
cc80: 4c 46 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  LFS.    /* SQLIT
cc90: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
cca0: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
ccb0: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
ccc0: 22 2c 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20  ",.#else.    /* 
ccd0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20  SQLITE_NOLFS    
cce0: 20 20 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a     */ 0,.#endif.
ccf0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55      /* SQLITE_AU
cd00: 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75  TH        */ "au
cd10: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69  thorization deni
cd20: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cd30: 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a  TE_FORMAT      *
cd40: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
cd50: 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a  TE_RANGE       *
cd60: 2f 20 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  / "column index 
cd70: 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20  out of range",. 
cd80: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
cd90: 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c  ADB      */ "fil
cda0: 65 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62  e is not a datab
cdb0: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
cdc0: 49 54 45 5f 4e 4f 54 49 43 45 20 20 20 20 20 20  ITE_NOTICE      
cdd0: 2a 2f 20 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e  */ "notification
cde0: 20 6d 65 73 73 61 67 65 22 2c 0a 20 20 20 20 2f   message",.    /
cdf0: 2a 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  * SQLITE_WARNING
ce00: 20 20 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67       */ "warning
ce10: 20 6d 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a   message",.  };.
ce20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
ce30: 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72  rr = "unknown er
ce40: 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20  ror";.  switch( 
ce50: 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  rc ){.    case S
ce60: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
ce70: 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45  BACK: {.      zE
ce80: 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20  rr = "abort due 
ce90: 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  to ROLLBACK";.  
cea0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ceb0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
cec0: 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45  _ROW: {.      zE
ced0: 72 72 20 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f  rr = "another ro
cee0: 77 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20  w available";.  
cef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
cf00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
cf10: 5f 44 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a  _DONE: {.      z
cf20: 45 72 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72  Err = "no more r
cf30: 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a  ows available";.
cf40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cf50: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
cf60: 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78  {.      rc &= 0x
cf70: 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ff;.      if( AL
cf80: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
cf90: 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67  c<ArraySize(aMsg
cfa0: 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30  ) && aMsg[rc]!=0
cfb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
cfc0: 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20   = aMsg[rc];.   
cfd0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
cfe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
cff0: 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a  turn zErr;.}../*
d000: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d010: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75   implements a bu
d020: 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74  sy callback that
d030: 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65   sleeps and trie
d040: 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c  s.** again until
d050: 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65   a timeout value
d060: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68   is reached.  Th
d070: 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  e timeout value 
d080: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
d090: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
d0a0: 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69  seconds passed i
d0b0: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n as the first.*
d0c0: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
d0d0: 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
d0e0: 6f 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 6c  o to retry the l
d0f0: 6f 63 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ock.  Return zer
d100: 6f 20 74 6f 20 73 74 6f 70 20 74 72 79 69 6e 67  o to stop trying
d110: 0a 2a 2a 20 61 6e 64 20 63 61 75 73 65 20 53 51  .** and cause SQ
d120: 4c 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53  Lite to return S
d130: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73  QLITE_BUSY..*/.s
d140: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
d150: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
d160: 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74 72  ack(.  void *ptr
d170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d180: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
d190: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
d1a0: 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  count,          
d1b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d1c0: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
d1d0: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20  s been busy */. 
d1e0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
d1f0: 46 69 6c 65 20 20 20 20 20 20 2f 2a 20 54 68 65  File      /* The
d200: 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74   file on which t
d210: 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64  he lock occurred
d220: 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54   */.){.#if SQLIT
d230: 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45  E_OS_WIN || HAVE
d240: 5f 55 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69  _USLEEP.  /* Thi
d250: 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 73 79  s case is for sy
d260: 73 74 65 6d 73 20 74 68 61 74 20 68 61 76 65 20  stems that have 
d270: 73 75 70 70 6f 72 74 20 66 6f 72 20 73 6c 65 65  support for slee
d280: 70 69 6e 67 20 66 6f 72 20 66 72 61 63 74 69 6f  ping for fractio
d290: 6e 73 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63  ns of.  ** a sec
d2a0: 6f 6e 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20  ond.  Examples: 
d2b0: 20 41 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79 73   All windows sys
d2c0: 74 65 6d 73 2c 20 75 6e 69 78 20 73 79 73 74 65  tems, unix syste
d2d0: 6d 73 20 77 69 74 68 20 75 73 6c 65 65 70 28 29  ms with usleep()
d2e0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
d2f0: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
d300: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
d310: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
d320: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
d330: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
d340: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
d350: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
d360: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
d370: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
d380: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
d390: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
d3a0: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
d3b0: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
d3c0: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
d3d0: 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20  tr;.  int tmout 
d3e0: 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75  = db->busyTimeou
d3f0: 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20  t;.  int delay, 
d400: 70 72 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53  prior;..#ifdef S
d410: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54  QLITE_ENABLE_SET
d420: 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66 28  LK_TIMEOUT.  if(
d430: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
d440: 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49  ntrol(pFile,SQLI
d450: 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49  TE_FCNTL_LOCK_TI
d460: 4d 45 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53  MEOUT,&tmout)==S
d470: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d480: 69 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20  if( count ){.   
d490: 20 20 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20     tmout = 0;.  
d4a0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
d4b0: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
d4c0: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
d4d0: 4b 5f 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75  K_TIMEOUT, &tmou
d4e0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
d4f0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
d500: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
d510: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
d520: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
d530: 52 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66  R(pFile);.#endif
d540: 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
d550: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75  >=0 );.  if( cou
d560: 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20  nt < NDELAY ){. 
d570: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
d580: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72  s[count];.    pr
d590: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75  ior = totals[cou
d5a0: 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt];.  }else{.  
d5b0: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
d5c0: 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20  [NDELAY-1];.    
d5d0: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e  prior = totals[N
d5e0: 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79  DELAY-1] + delay
d5f0: 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d  *(count-(NDELAY-
d600: 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1));.  }.  if( p
d610: 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74  rior + delay > t
d620: 6d 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61  mout ){.    dela
d630: 79 20 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f  y = tmout - prio
d640: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
d650: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
d660: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
d670: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
d680: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
d690: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
d6a0: 2f 2a 20 54 68 69 73 20 63 61 73 65 20 66 6f 72  /* This case for
d6b0: 20 75 6e 69 78 20 73 79 73 74 65 6d 73 20 74 68   unix systems th
d6c0: 61 74 20 6c 61 63 6b 20 75 73 6c 65 65 70 28 29  at lack usleep()
d6d0: 20 73 75 70 70 6f 72 74 2e 20 20 53 6c 65 65 70   support.  Sleep
d6e0: 69 6e 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  ing.  ** must be
d6f0: 20 64 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65   done in increme
d700: 6e 74 73 20 6f 66 20 77 68 6f 6c 65 20 73 65 63  nts of whole sec
d710: 6f 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  onds */.  sqlite
d720: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
d730: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d   *)ptr;.  int tm
d740: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
d750: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
d760: 6f 75 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  out;.  UNUSED_PA
d770: 52 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a  RAMETER(pFile);.
d780: 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a    if( (count+1)*
d790: 31 30 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a  1000 > tmout ){.
d7a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d7b0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
d7c0: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
d7d0: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
d7e0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
d7f0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
d800: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
d810: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
d820: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
d830: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
d840: 20 66 61 69 6c 65 64 20 74 6f 20 61 63 71 75 69   failed to acqui
d850: 72 65 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  re a.** lock on 
d860: 56 46 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a  VFS file pFile..
d870: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
d880: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
d890: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
d8a0: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
d8b0: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
d8c0: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
d8d0: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
d8e0: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
d8f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d900: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d910: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
d920: 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  , sqlite3_file *
d930: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
d940: 3b 0a 20 20 69 66 28 20 70 2d 3e 78 42 75 73 79  ;.  if( p->xBusy
d950: 48 61 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d  Handler==0 || p-
d960: 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72  >nBusy<0 ) retur
d970: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45  n 0;.  if( p->bE
d980: 78 74 72 61 46 69 6c 65 41 72 67 20 29 7b 0a 20  xtraFileArg ){. 
d990: 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 78 74     /* Add an ext
d9a0: 72 61 20 70 61 72 61 6d 65 74 65 72 20 77 69 74  ra parameter wit
d9b0: 68 20 74 68 65 20 70 46 69 6c 65 20 70 6f 69 6e  h the pFile poin
d9c0: 74 65 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ter to the end o
d9d0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c  f the.    ** cal
d9e0: 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c  lback argument l
d9f0: 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28  ist */.    int (
da00: 2a 78 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74  *xTra)(void*,int
da10: 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  ,sqlite3_file*);
da20: 0a 20 20 20 20 78 54 72 61 20 3d 20 28 69 6e 74  .    xTra = (int
da30: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71  (*)(void*,int,sq
da40: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e  lite3_file*))p->
da50: 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
da60: 20 20 72 63 20 3d 20 78 54 72 61 28 70 2d 3e 70    rc = xTra(p->p
da70: 42 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73  BusyArg, p->nBus
da80: 79 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c  y, pFile);.  }el
da90: 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63  se{.    /* Legac
daa0: 79 20 73 74 79 6c 65 20 62 75 73 79 20 68 61 6e  y style busy han
dab0: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  dler callback */
dac0: 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 78 42 75  .    rc = p->xBu
dad0: 73 79 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75  syHandler(p->pBu
dae0: 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29  syArg, p->nBusy)
daf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
db00: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  0 ){.    p->nBus
db10: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
db20: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b  .    p->nBusy++;
db30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
db40: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ; .}../*.** This
db50: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
db60: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
db70: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
db80: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
db90: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
dba0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
dbb0: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
dbc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dbd0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20  _busy_handler(. 
dbe0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
dbf0: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
dc00: 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  d*,int),.  void 
dc10: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
dc20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
dc30: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
dc40: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
dc50: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
dc60: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
dc70: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
dc80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
dc90: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
dca0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
dcb0: 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
dcc0: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
dcd0: 48 61 6e 64 6c 65 72 2e 70 42 75 73 79 41 72 67  Handler.pBusyArg
dce0: 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62   = pArg;.  db->b
dcf0: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
dd00: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
dd10: 48 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69  Handler.bExtraFi
dd20: 6c 65 41 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d  leArg = 0;.  db-
dd30: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30  >busyTimeout = 0
dd40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
dd50: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
dd60: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
dd70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
dd80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
dd90: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
dda0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ddb0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f  ine sets the pro
ddc0: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66  gress callback f
ddd0: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
dde0: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
ddf0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
de00: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
de10: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
de20: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
de30: 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62  llback will.** b
de40: 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20  e invoked every 
de50: 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f  nOps opcodes..*/
de60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72  .void sqlite3_pr
de70: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a  ogress_handler(.
de80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
de90: 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e    int nOps,.  in
dea0: 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76  t (*xProgress)(v
deb0: 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a  oid*), .  void *
dec0: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
ded0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
dee0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
def0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
df00: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
df10: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
df20: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
df30: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
df40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
df50: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
df60: 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b  .  if( nOps>0 ){
df70: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
df80: 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a  ss = xProgress;.
df90: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
dfa0: 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64  sOps = (unsigned
dfb0: 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70  )nOps;.    db->p
dfc0: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41  ProgressArg = pA
dfd0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
dfe0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
dff0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f   0;.    db->nPro
e000: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
e010: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
e020: 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  rg = 0;.  }.  sq
e030: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e040: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
e050: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
e060: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74  his routine inst
e070: 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62  alls a default b
e080: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74  usy handler that
e090: 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a   waits for the.*
e0a0: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62  * specified numb
e0b0: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
e0c0: 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ds before return
e0d0: 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ing 0..*/.int sq
e0e0: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
e0f0: 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ut(sqlite3 *db, 
e100: 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20  int ms){.#ifdef 
e110: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e120: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
e130: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
e140: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
e150: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
e160: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  KPT;.#endif.  if
e170: 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71  ( ms>0 ){.    sq
e180: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
e190: 65 72 28 64 62 2c 20 28 69 6e 74 28 2a 29 28 76  er(db, (int(*)(v
e1a0: 6f 69 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65  oid*,int))sqlite
e1b0: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
e1c0: 61 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ack,.           
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20    (void*)db);.  
e1f0: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
e200: 74 20 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e  t = ms;.    db->
e210: 62 75 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74  busyHandler.bExt
e220: 72 61 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20  raFileArg = 1;. 
e230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
e240: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
e250: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
e260: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e270: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
e280: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
e290: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
e2a0: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
e2b0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
e2c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
e2d0: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
e2e0: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
e2f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e300: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
e310: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
e320: 28 64 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c  (db) && (db==0 |
e330: 7c 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c  | db->magic!=SQL
e340: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
e350: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
e360: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e370: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
e380: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e   }.#endif.  db->
e390: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
e3a0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
e3b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
e3c0: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
e3d0: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
e3e0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
e3f0: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
e400: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
e410: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
e420: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
e430: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
e440: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
e450: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
e460: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e470: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
e480: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
e490: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
e4a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
e4b0: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
e4c0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
e4d0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
e4e0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e4f0: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
e500: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
e510: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
e520: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
e530: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
e540: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
e550: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
e560: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
e570: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
e580: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e590: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
e5a0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
e5b0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
e5c0: 20 76 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28   void (*xValue)(
e5d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e5e0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e 76  ),.  void (*xInv
e5f0: 65 72 73 65 29 28 73 71 6c 69 74 65 33 5f 63 6f  erse)(sqlite3_co
e600: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e610: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e620: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
e630: 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20  pDestructor.){. 
e640: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
e650: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  nt nName;.  int 
e660: 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61  extraFlags;..  a
e670: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e680: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
e690: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e6a0: 28 20 78 56 61 6c 75 65 3d 3d 30 20 7c 7c 20 78  ( xValue==0 || x
e6b0: 53 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 69 66  SFunc==0 );.  if
e6c0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
e6d0: 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
e6e0: 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61    /* Must have a
e6f0: 20 76 61 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a 20   valid name */. 
e700: 20 20 7c 7c 20 28 78 53 46 75 6e 63 21 3d 30 20    || (xSFunc!=0 
e710: 26 26 20 78 46 69 6e 61 6c 21 3d 30 29 20 20 20  && xFinal!=0)   
e720: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 62 6f 74 68       /* Not both
e730: 20 78 53 46 75 6e 63 20 61 6e 64 20 78 46 69 6e   xSFunc and xFin
e740: 61 6c 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 46  al */.   || ((xF
e750: 69 6e 61 6c 3d 3d 30 29 21 3d 28 78 53 74 65 70  inal==0)!=(xStep
e760: 3d 3d 30 29 29 20 20 20 20 20 20 20 2f 2a 20 42  ==0))       /* B
e770: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f  oth or neither o
e780: 66 20 78 46 69 6e 61 6c 20 61 6e 64 20 78 53 74  f xFinal and xSt
e790: 65 70 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 56  ep */.   || ((xV
e7a0: 61 6c 75 65 3d 3d 30 29 21 3d 28 78 49 6e 76 65  alue==0)!=(xInve
e7b0: 72 73 65 3d 3d 30 29 29 20 20 20 20 2f 2a 20 42  rse==0))    /* B
e7c0: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f  oth or neither o
e7d0: 66 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72  f xValue, xInver
e7e0: 73 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41 72  se */.   || (nAr
e7f0: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
e800: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
e810: 5f 41 52 47 29 0a 20 20 20 7c 7c 20 28 32 35 35  _ARG).   || (255
e820: 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  <(nName = sqlite
e830: 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63  3Strlen30( zFunc
e840: 74 69 6f 6e 4e 61 6d 65 29 29 29 0a 20 20 29 7b  tionName))).  ){
e850: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e860: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
e870: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53    }..  assert( S
e880: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
e890: 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45  ANT==SQLITE_DETE
e8a0: 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65  RMINISTIC );.  e
e8b0: 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20  xtraFlags = enc 
e8c0: 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  &  SQLITE_DETERM
e8d0: 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26  INISTIC;.  enc &
e8e0: 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45  = (SQLITE_FUNC_E
e8f0: 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e  NCMASK|SQLITE_AN
e900: 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53  Y);.  .#ifndef S
e910: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
e920: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
e930: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
e940: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
e950: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
e960: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
e970: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
e980: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
e990: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
e9a0: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
e9b0: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
e9c0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
e9d0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
e9e0: 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ally..  **.  ** 
e9f0: 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73  If SQLITE_ANY is
ea00: 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20   specified, add 
ea10: 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
ea20: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20  f the function. 
ea30: 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20   ** to the hash 
ea40: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
ea50: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ( enc==SQLITE_UT
ea60: 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d  F16 ){.    enc =
ea70: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
ea80: 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  IVE;.  }else if(
ea90: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59   enc==SQLITE_ANY
eaa0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
eab0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
eac0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
ead0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
eae0: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c  rg, SQLITE_UTF8|
eaf0: 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20  extraFlags,.    
eb00: 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20       pUserData, 
eb10: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78  xSFunc, xStep, x
eb20: 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78  Final, xValue, x
eb30: 49 6e 76 65 72 73 65 2c 20 70 44 65 73 74 72 75  Inverse, pDestru
eb40: 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ctor);.    if( r
eb50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
eb60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
eb70: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
eb80: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
eb90: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
eba0: 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c  16LE|extraFlags,
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
ebc0: 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53  Data, xSFunc, xS
ebd0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61  tep, xFinal, xVa
ebe0: 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70  lue, xInverse, p
ebf0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
ec00: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
ec10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ec20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
ec30: 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c   }.    enc = SQL
ec40: 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d  ITE_UTF16BE;.  }
ec50: 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53  .#else.  enc = S
ec60: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64  QLITE_UTF8;.#end
ec70: 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  if.  .  /* Check
ec80: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
ec90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
eca0: 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20  g overridden or 
ecb0: 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a  deleted. If so,.
ecc0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
ecd0: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74  re active VMs, t
ece0: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
ecf0: 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e  E_BUSY. If a fun
ed00: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65  ction.  ** is be
ed10: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64  ing overridden/d
ed20: 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65  eleted but there
ed30: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
ed40: 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20  Ms, allow the.  
ed50: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
ed60: 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76  continue but inv
ed70: 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63  alidate all prec
ed80: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
ed90: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  ts..  */.  p = s
eda0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
edb0: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
edc0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
edd0: 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  enc, 0);.  if( p
ede0: 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67   && (p->funcFlag
edf0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
ee00: 45 4e 43 4d 41 53 4b 29 3d 3d 28 75 33 32 29 65  ENCMASK)==(u32)e
ee10: 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e  nc && p->nArg==n
ee20: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Arg ){.    if( d
ee30: 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
ee40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ee50: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
ee60: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
ee70: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
ee80: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
ee90: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
eea0: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
eeb0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
eec0: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
eed0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
eee0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eef0: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
ef00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ef10: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
ef20: 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20  ements(db, 0);. 
ef30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20     }.  }..  p = 
ef40: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
ef50: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
ef60: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
ef70: 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65  )enc, 1);.  asse
ef80: 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  rt(p || db->mall
ef90: 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28  ocFailed);.  if(
efa0: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
efb0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
efc0: 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
efd0: 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69  f an older versi
efe0: 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  on of the functi
eff0: 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67  on with a config
f000: 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20  ured destructor 
f010: 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  is.  ** being re
f020: 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68  placed invoke th
f030: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e  e destructor fun
f040: 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20  ction here. */. 
f050: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
f060: 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20  (db, p);..  if( 
f070: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
f080: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
f090: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d  nRef++;.  }.  p-
f0a0: 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d  >u.pDestructor =
f0b0: 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20   pDestructor;.  
f0c0: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28  p->funcFlags = (
f0d0: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
f0e0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
f0f0: 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73  SK) | extraFlags
f100: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d  ;.  testcase( p-
f110: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
f120: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
f130: 43 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63  C );.  p->xSFunc
f140: 20 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75   = xSFunc ? xSFu
f150: 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d  nc : xStep;.  p-
f160: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
f170: 6e 61 6c 3b 0a 20 20 70 2d 3e 78 56 61 6c 75 65  nal;.  p->xValue
f180: 20 3d 20 78 56 61 6c 75 65 3b 0a 20 20 70 2d 3e   = xValue;.  p->
f190: 78 49 6e 76 65 72 73 65 20 3d 20 78 49 6e 76 65  xInverse = xInve
f1a0: 72 73 65 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  rse;.  p->pUserD
f1b0: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
f1c0: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31  .  p->nArg = (u1
f1d0: 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  6)nArg;.  return
f1e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f1f0: 2a 0a 2a 2a 20 57 6f 72 6b 65 72 20 66 75 6e 63  *.** Worker func
f200: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 75 74 66  tion used by utf
f210: 2d 38 20 41 50 49 73 20 74 68 61 74 20 63 72 65  -8 APIs that cre
f220: 61 74 65 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e  ate new function
f230: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
f240: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
f250: 69 6f 6e 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69  ion().**    sqli
f260: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
f270: 69 6f 6e 5f 76 32 28 29 0a 2a 2a 20 20 20 20 73  ion_v2().**    s
f280: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69  qlite3_create_wi
f290: 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 29 0a  ndow_function().
f2a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
f2b0: 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28  eateFunctionApi(
f2c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
f2d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f2e0: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
f2f0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
f300: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
f310: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
f320: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
f330: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
f340: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
f350: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
f360: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
f370: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
f380: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
f390: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
f3a0: 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74   (*xValue)(sqlit
f3b0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
f3c0: 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29  void (*xInverse)
f3d0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f3e0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
f3f0: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  lue**),.  void(*
f400: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29  xDestroy)(void*)
f410: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
f420: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46  QLITE_ERROR;.  F
f430: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
f440: 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  Arg = 0;..#ifdef
f450: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f460: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f470: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f480: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f490: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
f4a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
f4b0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f4c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f4d0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44  mutex);.  if( xD
f4e0: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41  estroy ){.    pA
f4f0: 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75  rg = (FuncDestru
f500: 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  ctor *)sqlite3Ma
f510: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 75 6e 63  lloc(sizeof(Func
f520: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
f530: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
f540: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
f550: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
f560: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
f570: 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20     goto out;.   
f580: 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 6e 52 65   }.    pArg->nRe
f590: 66 20 3d 20 30 3b 0a 20 20 20 20 70 41 72 67 2d  f = 0;.    pArg-
f5a0: 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73  >xDestroy = xDes
f5b0: 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e  troy;.    pArg->
f5c0: 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20  pUserData = p;. 
f5d0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
f5e0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
f5f0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
f600: 2c 20 70 2c 20 0a 20 20 20 20 20 20 78 53 46 75  , p, .      xSFu
f610: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
f620: 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65  l, xValue, xInve
f630: 72 73 65 2c 20 70 41 72 67 0a 20 20 29 3b 0a 20  rse, pArg.  );. 
f640: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
f650: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
f660: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f670: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78  LITE_OK );.    x
f680: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
f690: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72  sqlite3_free(pAr
f6a0: 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20  g);.  }.. out:. 
f6b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
f6c0: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
f6d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f6e0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f6f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f700: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77  /*.** Create new
f710: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e   user functions.
f720: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
f730: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
f740: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
f750: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f760: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
f770: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
f780: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
f790: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
f7a0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
f7b0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
f7c0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
f7d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f7e0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
f7f0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
f800: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
f810: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
f820: 72 65 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e  return createFun
f830: 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75  ctionApi(db, zFu
f840: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
f850: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
f860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20       xFinal, 0, 
f890: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
f8a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
f8b0: 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
f8c0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
f8d0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69  char *zFunc,.  i
f8e0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
f8f0: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  nc,.  void *p,. 
f900: 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28   void (*xSFunc)(
f910: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f920: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
f930: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
f940: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
f950: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
f960: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
f970: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
f980: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f990: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
f9a0: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
f9b0: 7b 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61 74  {.  return creat
f9c0: 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c  eFunctionApi(db,
f9d0: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
f9e0: 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53  c, p, xSFunc, xS
f9f0: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
fa20: 20 30 2c 20 30 2c 20 78 44 65 73 74 72 6f 79 29   0, 0, xDestroy)
fa30: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
fa40: 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75  create_window_fu
fa50: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
fa60: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
fa70: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
fa80: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
fa90: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
faa0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
fab0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fac0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fad0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
fae0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
faf0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
fb00: 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74   (*xValue)(sqlit
fb10: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
fb20: 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29  void (*xInverse)
fb30: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
fb40: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
fb50: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
fb60: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
fb70: 20 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   *).){.  return 
fb80: 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70  createFunctionAp
fb90: 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  i(db, zFunc, nAr
fba0: 67 2c 20 65 6e 63 2c 20 70 2c 20 30 2c 20 78 53  g, enc, p, 0, xS
fbb0: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
fbe0: 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73   xValue, xInvers
fbf0: 65 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a  e, xDestroy);.}.
fc00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fc10: 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73  OMIT_UTF16.int s
fc20: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
fc30: 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  nction16(.  sqli
fc40: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
fc50: 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e   void *zFunction
fc60: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
fc70: 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70  ,.  int eTextRep
fc80: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
fc90: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
fca0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fcb0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fcc0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
fcd0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
fce0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
fcf0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
fd00: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
fd10: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
fd20: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
fd30: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66  ar *zFunc8;..#if
fd40: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
fd50: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
fd60: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
fd70: 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
fd80: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
fd90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fda0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
fdb0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
fdc0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
fdd0: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
fde0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
fdf0: 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20  d );.  zFunc8 = 
fe00: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
fe10: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
fe20: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
fe30: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63  F16NATIVE);.  rc
fe40: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
fe50: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c  Func(db, zFunc8,
fe60: 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c   nArg, eTextRep,
fe70: 20 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70   p, xSFunc,xStep
fe80: 2c 78 46 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a  ,xFinal,0,0,0);.
fe90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fea0: 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72  db, zFunc8);.  r
feb0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
fec0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
fed0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
fee0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
fef0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
ff00: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
ff10: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65  following is the
ff20: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
ff30: 6f 66 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  of an SQL functi
ff40: 6f 6e 20 74 68 61 74 20 61 6c 77 61 79 73 0a 2a  on that always.*
ff50: 2a 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20  * fails with an 
ff60: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
ff70: 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 66  ating that the f
ff80: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
ff90: 69 6e 20 74 68 65 0a 2a 2a 20 77 72 6f 6e 67 20  in the.** wrong 
ffa0: 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 73 71  context.  The sq
ffb0: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
ffc0: 75 6e 63 74 69 6f 6e 28 29 20 41 50 49 20 6d 69  unction() API mi
ffd0: 67 68 74 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a  ght construct.**
ffe0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68   SQL function th
fff0: 61 74 20 75 73 65 20 74 68 69 73 20 72 6f 75 74  at use this rout
10000 69 6e 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ine so that the 
10010 66 75 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20 65  functions will e
10020 78 69 73 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65  xist.** for name
10030 20 72 65 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20   resolution but 
10040 61 72 65 20 61 63 74 75 61 6c 6c 79 20 6f 76 65  are actually ove
10050 72 6c 6f 61 64 65 64 20 62 79 20 74 68 65 20 78  rloaded by the x
10060 46 69 6e 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20  FindFunction.** 
10070 6d 65 74 68 6f 64 20 6f 66 20 76 69 72 74 75 61  method of virtua
10080 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
10090 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
100a0 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 28  InvalidFunction(
100b0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
100c0 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 20 2f 2a  xt *context,  /*
100d0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   The function ca
100e0 6c 6c 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  lling context */
100f0 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20  .  int NotUsed, 
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10110 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
10120 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
10130 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
10140 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65  3_value **NotUse
10150 64 32 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66  d2   /* Value of
10160 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
10170 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
10180 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
10190 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
101a0 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
101b0 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  t);.  char *zErr
101c0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
101d0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
101e0 6f 74 55 73 65 64 32 29 3b 0a 20 20 7a 45 72 72  otUsed2);.  zErr
101f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10200 74 66 28 0a 20 20 20 20 20 20 22 75 6e 61 62 6c  tf(.      "unabl
10210 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f  e to use functio
10220 6e 20 25 73 20 69 6e 20 74 68 65 20 72 65 71 75  n %s in the requ
10230 65 73 74 65 64 20 63 6f 6e 74 65 78 74 22 2c 20  ested context", 
10240 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
10250 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
10260 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31  ontext, zErr, -1
10270 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
10280 65 28 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(zErr);.}../*.*
10290 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61  * Declare that a
102a0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
102b0 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  en overloaded by
102c0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
102d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
102e0 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  unction already 
102f0 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75  exists as a regu
10300 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  lar global funct
10310 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ion, then.** thi
10320 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10330 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75  o-op.  If the fu
10340 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
10350 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61  exist, then crea
10360 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20  te.** a new one 
10370 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f  that always thro
10380 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  ws a run-time er
10390 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  ror.  .**.** Whe
103a0 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
103b0 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69   intend to provi
103c0 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64  de an overloaded
103d0 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a   function, they.
103e0 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74  ** should call t
103f0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d  his routine to m
10400 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f  ake sure the glo
10410 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  bal function exi
10420 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  sts..** A global
10430 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65   function must e
10440 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  xist in order fo
10450 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
10460 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f  n to work.** pro
10470 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  perly..*/.int sq
10480 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
10490 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
104a0 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
104b0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
104c0 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74  nt nArg.){.  int
104d0 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f   rc;.  char *zCo
104e0 70 79 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  py;..#ifdef SQLI
104f0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10500 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10510 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10520 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
10530 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20  || nArg<-2 ){.  
10540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10550 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
10560 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10570 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10580 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d  ->mutex);.  rc =
10590 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
105a0 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
105b0 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
105c0 38 2c 20 30 29 21 3d 30 3b 0a 20 20 73 71 6c 69  8, 0)!=0;.  sqli
105d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
105e0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
105f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 53 51  ( rc ) return SQ
10600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79  LITE_OK;.  zCopy
10610 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10620 74 66 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  tf(zName);.  if(
10630 20 7a 43 6f 70 79 3d 3d 30 20 29 20 72 65 74 75   zCopy==0 ) retu
10640 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10650 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10660 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
10670 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  n_v2(db, zName, 
10680 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
10690 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
106b0 6f 70 79 2c 20 73 71 6c 69 74 65 33 49 6e 76 61  opy, sqlite3Inva
106c0 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  lidFunction, 0, 
106d0 30 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  0, sqlite3_free)
106e0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
106f0 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
10700 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
10710 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
10720 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
10730 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
10740 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
10750 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
10760 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
10770 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
10780 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
10790 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
107a0 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
107b0 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
107c0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
107d0 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
107e0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
107f0 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
10800 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ement..*/.#ifnde
10810 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
10820 50 52 45 43 41 54 45 44 0a 76 6f 69 64 20 2a 73  PRECATED.void *s
10830 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
10840 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a  ite3 *db, void(*
10850 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f  xTrace)(void*,co
10860 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64  nst char*), void
10870 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20   *pArg){.  void 
10880 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
10890 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
108a0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
108b0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
108c0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
108d0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
108e0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
108f0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
10900 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10910 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
10920 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
10930 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d  pTraceArg;.  db-
10940 3e 6d 54 72 61 63 65 20 3d 20 78 54 72 61 63 65  >mTrace = xTrace
10950 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f   ? SQLITE_TRACE_
10960 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20 20 64 62  LEGACY : 0;.  db
10970 2d 3e 78 54 72 61 63 65 20 3d 20 28 69 6e 74 28  ->xTrace = (int(
10980 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69  *)(u32,void*,voi
10990 64 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61 63 65  d*,void*))xTrace
109a0 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72  ;.  db->pTraceAr
109b0 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
109c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
109d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
109e0 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
109f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10a00 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f  IT_DEPRECATED */
10a10 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20  ../* Register a 
10a20 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 75  trace callback u
10a30 73 69 6e 67 20 74 68 65 20 76 65 72 73 69 6f 6e  sing the version
10a40 2d 32 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  -2 interface..*/
10a50 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  .int sqlite3_tra
10a60 63 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  ce_v2(.  sqlite3
10a70 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 20 20 20 2f 2a 20 54 72 61 63 65 20 74 68 69      /* Trace thi
10aa0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
10ab0 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 72 61 63    unsigned mTrac
10ac0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ae0 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74 73 20 74  Mask of events t
10af0 6f 20 62 65 20 74 72 61 63 65 64 20 2a 2f 0a 20  o be traced */. 
10b00 20 69 6e 74 28 2a 78 54 72 61 63 65 29 28 75 6e   int(*xTrace)(un
10b10 73 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69  signed,void*,voi
10b20 64 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43  d*,void*),  /* C
10b30 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b  allback to invok
10b40 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  e */.  void *pAr
10b50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a    /* Context */.
10b80 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
10b90 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10ba0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10bb0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
10bc0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
10bd0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
10be0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
10bf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10c00 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10c10 0a 20 20 69 66 28 20 6d 54 72 61 63 65 3d 3d 30  .  if( mTrace==0
10c20 20 29 20 78 54 72 61 63 65 20 3d 20 30 3b 0a 20   ) xTrace = 0;. 
10c30 20 69 66 28 20 78 54 72 61 63 65 3d 3d 30 20 29   if( xTrace==0 )
10c40 20 6d 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 64   mTrace = 0;.  d
10c50 62 2d 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72 61  b->mTrace = mTra
10c60 63 65 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65  ce;.  db->xTrace
10c70 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d   = xTrace;.  db-
10c80 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
10c90 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
10ca0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
10cb0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
10cc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
10cd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10ce0 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
10cf0 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66   Register a prof
10d00 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ile function.  T
10d10 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
10d20 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
10d30 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69  stered .** profi
10d40 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  le function is r
10d50 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
10d60 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20   A NULL profile 
10d70 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
10d80 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67  hat no profiling
10d90 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
10da0 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f   non-NULL.** pro
10db0 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65  file is a pointe
10dc0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
10dd0 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
10de0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
10df0 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c  n of.** each SQL
10e00 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
10e10 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  is run..*/.void 
10e20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65  *sqlite3_profile
10e30 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10e40 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69  .  void (*xProfi
10e50 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  le)(void*,const 
10e60 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e  char*,sqlite_uin
10e70 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
10e80 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  rg.){.  void *pO
10e90 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
10ea0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10eb0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10ec0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10ed0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
10ee0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
10ef0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
10f00 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
10f10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10f20 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10f30 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
10f40 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
10f50 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
10f60 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
10f70 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
10f80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10f90 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10fa0 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
10fb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10fc0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
10fd0 45 44 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ED */.#endif /* 
10fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
10ff0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  E */../*.** Regi
11000 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  ster a function 
11010 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68  to be invoked wh
11020 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
11030 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20   commits..** If 
11040 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63  the invoked func
11050 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tion returns non
11060 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
11070 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61  commit becomes a
11080 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  .** rollback..*/
11090 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63  .void *sqlite3_c
110a0 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71  ommit_hook(.  sq
110b0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
110c0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
110d0 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
110e0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
110f0 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
11100 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75  )(void*),  /* Fu
11110 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65  nction to invoke
11120 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20   on each commit 
11130 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11150 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
11160 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
11170 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a  .  void *pOld;..
11180 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11190 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
111a0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
111b0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
111c0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
111d0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
111e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
111f0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
11200 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
11210 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
11220 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  d = db->pCommitA
11230 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69  rg;.  db->xCommi
11240 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  tCallback = xCal
11250 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f  lback;.  db->pCo
11260 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a  mmitArg = pArg;.
11270 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11280 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
11290 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
112a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
112b0 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
112c0 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
112d0 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
112e0 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
112f0 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
11300 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
11310 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
11320 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
11330 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73  update_hook(.  s
11340 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
11350 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
11360 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
11370 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
11380 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
11390 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
113a0 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20  ar const *,char 
113b0 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69  const *,sqlite_i
113c0 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
113d0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
113e0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
113f0 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
11400 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
11410 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
11420 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
11430 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
11440 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
11450 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
11460 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
11470 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
11480 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
11490 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
114a0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
114b0 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64   pRet = db->pUpd
114c0 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55  ateArg;.  db->xU
114d0 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20  pdateCallback = 
114e0 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
114f0 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  >pUpdateArg = pA
11500 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11510 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11520 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11530 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
11540 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
11550 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
11560 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
11570 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
11580 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69  d.** back by thi
11590 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
115a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
115b0 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
115c0 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
115d0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
115e0 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
115f0 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
11600 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
11610 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
11620 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63  id*), /* Callbac
11630 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
11640 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
11650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
11660 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
11670 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
11680 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65  id *pRet;..#ifde
11690 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
116a0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
116b0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
116c0 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
116d0 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
116e0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
116f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
11700 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
11710 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
11720 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
11730 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b  b->pRollbackArg;
11740 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  .  db->xRollback
11750 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
11760 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c  back;.  db->pRol
11770 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b  lbackArg = pArg;
11780 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11790 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
117a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
117b0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
117c0 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
117d0 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52  ATE_HOOK./*.** R
117e0 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
117f0 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
11800 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
11810 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
11820 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
11830 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
11840 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11850 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
11860 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68  ite3_preupdate_h
11870 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
11880 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
11890 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
118a0 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
118b0 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a  base */.  void(*
118c0 78 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20 20  xCallback)(     
118d0 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
118e0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
118f0 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
11900 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63  nt,char const*,c
11910 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74  har const*,sqlit
11920 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65 33  e3_int64,sqlite3
11930 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
11940 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
11950 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 61       /* First ca
11960 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20  llback argument 
11970 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
11980 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
11990 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
119a0 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
119b0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
119c0 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
119d0 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  teCallback = xCa
119e0 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50  llback;.  db->pP
119f0 72 65 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  reUpdateArg = pA
11a00 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
11a10 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11a20 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11a30 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
11a40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
11a50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
11a60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11a70 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
11a80 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
11a90 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
11aa0 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71  registered by sq
11ab0 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
11ac0 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49  eckpoint()..** I
11ad0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61  nvoke sqlite3_wa
11ae0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  l_checkpoint if 
11af0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
11b00 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
11b10 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
11b20 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e  er than sqlite3.
11b30 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20  pWalArg cast to 
11b40 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20  an integer (the 
11b50 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
11b60 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63   by.** wal_autoc
11b70 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  heckpoint())..*/
11b80 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c   .int sqlite3Wal
11b90 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76  DefaultHook(.  v
11ba0 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
11bb0 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  ,     /* Argumen
11bc0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
11bd0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db,           /*
11be0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   Connection */. 
11bf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
11c00 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
11c10 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ase */.  int nFr
11c20 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
11c30 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a  /* Size of WAL *
11c40 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d  /.){.  if( nFram
11c50 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  e>=SQLITE_PTR_TO
11c60 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61  _INT(pClientData
11c70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11c80 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
11c90 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
11ca0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
11cb0 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71  db, zDb);.    sq
11cc0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
11cd0 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65  lloc();.  }.  re
11ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11cf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11d00 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
11d10 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
11d20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  an sqlite3_wal_h
11d30 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74  ook() callback t
11d40 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
11d50 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20  checkpoint.** a 
11d60 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63  database after c
11d70 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
11d80 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
11d90 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a   are nFrame or.*
11da0 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e  * more frames in
11db0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50   the log file. P
11dc0 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61  assing zero or a
11dd0 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
11de0 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65  as the.** nFrame
11df0 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62   parameter disab
11e00 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68  les automatic ch
11e10 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65  eckpoints entire
11e20 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ly..**.** The ca
11e30 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
11e40 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
11e50 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20  on replaces any 
11e60 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63  existing callbac
11e70 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20  k.** registered 
11e80 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
11e90 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69  l_hook(). Likewi
11ea0 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20  se, registering 
11eb0 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73  a callback.** us
11ec0 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
11ed0 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20  hook() disables 
11ee0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68  the automatic ch
11ef0 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69  eckpoint mechani
11f00 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  sm.** configured
11f10 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
11f20 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
11f30 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
11f40 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
11f50 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23  , int nFrame){.#
11f60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11f70 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50  T_WAL.  UNUSED_P
11f80 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
11f90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11fa0 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a  (nFrame);.#else.
11fb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11fc0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
11fd0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
11fe0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
11ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
12000 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
12010 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  if.  if( nFrame>
12020 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12030 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71  _wal_hook(db, sq
12040 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
12050 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ook, SQLITE_INT_
12060 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b  TO_PTR(nFrame));
12070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
12080 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
12090 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  b, 0, 0);.  }.#e
120a0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
120b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
120c0 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
120d0 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
120e0 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
120f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77  transaction is w
12100 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74  ritten.** into t
12110 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c  he write-ahead-l
12120 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62  og by this datab
12130 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
12140 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
12150 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  _wal_hook(.  sql
12160 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12180 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
12190 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c  to this db handl
121a0 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c  e */.  int(*xCal
121b0 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73  lback)(void *, s
121c0 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
121d0 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f  har*, int),.  vo
121e0 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12200 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
12210 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62  passed to xCallb
12220 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ack() */.){.#ifn
12230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12240 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  WAL.  void *pRet
12250 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
12260 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
12270 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
12280 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
12290 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
122a0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
122b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
122c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
122d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
122e0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
122f0 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72  Ret = db->pWalAr
12300 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c  g;.  db->xWalCal
12310 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
12320 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67  k;.  db->pWalArg
12330 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
12340 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
12350 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
12360 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a  urn pRet;.#else.
12370 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
12380 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
12390 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
123a0 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zDb..*/.int sqli
123b0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
123c0 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  nt_v2(.  sqlite3
123d0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
123e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
123f0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
12400 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
12410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12420 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61   /* Name of atta
12430 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f  ched database (o
12440 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
12450 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20   eMode,         
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12470 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
12480 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  T_* value */.  i
12490 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20  nt *pnLog,      
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
124b0 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57  * OUT: Size of W
124c0 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73  AL log in frames
124d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70   */.  int *pnCkp
124e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
124f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
12500 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  tal number of fr
12510 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65  ames checkpointe
12520 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  d */.){.#ifdef S
12530 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
12540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12550 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  K;.#else.  int r
12560 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12580 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
12590 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f  nt iDb = SQLITE_
125a0 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f  MAX_ATTACHED;  /
125b0 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20  * sqlite3.aDb[] 
125c0 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63  index of db to c
125d0 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69  heckpoint */..#i
125e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
125f0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
12600 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
12610 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
12620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
12630 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
12640 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
12650 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  e the output var
12660 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20  iables to -1 in 
12670 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
12680 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70  curs. */.  if( p
12690 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20  nLog ) *pnLog = 
126a0 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74  -1;.  if( pnCkpt
126b0 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b   ) *pnCkpt = -1;
126c0 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
126d0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
126e0 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73  SSIVE==0 );.  as
126f0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
12700 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20  CKPOINT_FULL==1 
12710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
12720 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
12730 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61  ESTART==2 );.  a
12740 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
12750 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
12760 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65 4d  E==3 );.  if( eM
12770 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode<SQLITE_CHECK
12780 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c  POINT_PASSIVE ||
12790 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48   eMode>SQLITE_CH
127a0 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
127b0 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  E ){.    /* EVID
127c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36  ENCE-OF: R-03996
127d0 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70 61 72  -12088 The M par
127e0 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61  ameter must be a
127f0 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e   valid checkpoin
12800 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a  t.    ** mode: *
12810 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
12820 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
12830 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12840 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
12850 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20  );.  if( zDb && 
12860 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44  zDb[0] ){.    iD
12870 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
12880 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
12890 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20    }.  if( iDb<0 
128a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
128b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
128c0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
128d0 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52  g(db, SQLITE_ERR
128e0 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  OR, "unknown dat
128f0 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29  abase: %s", zDb)
12900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
12910 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
12920 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  Busy = 0;.    rc
12930 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
12940 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
12950 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
12960 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
12970 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
12980 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
12990 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
129a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
129b0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
129c0 74 61 74 65 6d 65 6e 74 73 2c 20 63 6c 65 61 72  tatements, clear
129d0 20 74 68 65 20 69 6e 74 65 72 72 75 70 74 20 66   the interrupt f
129e0 6c 61 67 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  lag at this.  **
129f0 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 69 66   point.  */.  if
12a00 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
12a10 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  e==0 ){.    db->
12a20 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
12a30 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c   = 0;.  }..  sql
12a40 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12a50 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
12a60 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
12a70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
12a80 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
12a90 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55  Db. If zDb is NU
12aa0 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75  LL, or if the bu
12ab0 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a  ffer zDb points.
12ac0 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61  ** to contains a
12ad0 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72   zero-length str
12ae0 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65  ing, all attache
12af0 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  d databases are 
12b00 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
12b10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12b20 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
12b30 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
12b40 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
12b50 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
12b60 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54   R-41613-20553 T
12b70 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  he sqlite3_wal_c
12b80 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69  heckpoint(D,X) i
12b90 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
12ba0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c    ** sqlite3_wal
12bb0 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44  _checkpoint_v2(D
12bc0 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  ,X,SQLITE_CHECKP
12bd0 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30  OINT_PASSIVE,0,0
12be0 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ). */.  return s
12bf0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
12c00 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c  point_v2(db,zDb,
12c10 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
12c20 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a  T_PASSIVE,0,0);.
12c30 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12c40 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
12c50 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   Run a checkpoin
12c60 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44  t on database iD
12c70 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  b. This is a no-
12c80 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69  op if database i
12c90 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72  Db is.** not cur
12ca0 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57  rently open in W
12cb0 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  AL mode..**.** I
12cc0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
12cd0 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  is open on the d
12ce0 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68  atabase being ch
12cf0 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73  eckpointed, this
12d00 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
12d10 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
12d20 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70  KED and a checkp
12d30 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65  oint is not atte
12d40 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e  mpted. If .** an
12d50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
12d60 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ile running the 
12d70 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53  checkpoint, an S
12d80 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
12d90 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
12da0 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f   (i.e. SQLITE_IO
12db0 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  ERR). Otherwise,
12dc0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
12dd0 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  * The mutex on d
12de0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
12df0 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  b should be held
12e00 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
12e10 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73  The mutex.** ass
12e20 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12e30 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65   specific b-tree
12e40 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
12e50 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a  ted is taken by.
12e60 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
12e70 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b   while the check
12e80 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67  point is running
12e90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69  ..**.** If iDb i
12ea0 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f  s passed SQLITE_
12eb0 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68  MAX_ATTACHED, th
12ec0 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  en all attached 
12ed0 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a  databases are.**
12ee0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49   checkpointed. I
12ef0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
12f00 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
12f10 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
12f20 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74  tely -.** no att
12f30 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
12f40 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72  checkpoint any r
12f50 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73  emaining databas
12f60 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  es..**.** Parame
12f70 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65  ter eMode is one
12f80 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   of SQLITE_CHECK
12f90 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46  POINT_PASSIVE, F
12fa0 55 4c 4c 2c 20 52 45 53 54 41 52 54 0a 2a 2a 20  ULL, RESTART.** 
12fb0 6f 72 20 54 52 55 4e 43 41 54 45 2e 0a 2a 2f 0a  or TRUNCATE..*/.
12fc0 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
12fd0 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
12fe0 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
12ff0 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f  eMode, int *pnLo
13000 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b  g, int *pnCkpt){
13010 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13020 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
13030 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
13040 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
13070 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
13080 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a  h attached dbs *
13090 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20  /.  int bBusy = 
130a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
130b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53      /* True if S
130c0 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62  QLITE_BUSY has b
130d0 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  een encountered 
130e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
130f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13100 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
13110 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20   assert( !pnLog 
13120 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b  || *pnLog==-1 );
13130 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b  .  assert( !pnCk
13140 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d  pt || *pnCkpt==-
13150 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  1 );..  for(i=0;
13160 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63   i<db->nDb && rc
13170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
13180 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44  ){.    if( i==iD
13190 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45  b || iDb==SQLITE
131a0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b  _MAX_ATTACHED ){
131b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
131c0 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69  te3BtreeCheckpoi
131d0 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  nt(db->aDb[i].pB
131e0 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  t, eMode, pnLog,
131f0 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20   pnCkpt);.      
13200 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20  pnLog = 0;.     
13210 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20   pnCkpt = 0;.   
13220 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13230 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
13240 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20    bBusy = 1;.   
13250 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13260 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
13270 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
13280 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
13290 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49  && bBusy) ? SQLI
132a0 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a  TE_BUSY : rc;.}.
132b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
132c0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
132d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
132e0 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
132f0 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68  f main-memory sh
13300 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73  ould be used ins
13310 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d  tead of.** a tem
13320 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20  porary file for 
13330 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20  transient pager 
13340 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d  files and statem
13350 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ent journals..**
13360 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
13370 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ned depends on t
13380 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e  he value of db->
13390 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74  temp_store (runt
133a0 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ime.** parameter
133b0 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  ) and the compil
133c0 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20  e time value of 
133d0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
133e0 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  E. The.** follow
133f0 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
13400 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  bes the relation
13410 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65  ship between the
13420 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  se two values.**
13430 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
13440 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ons return value
13450 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
13460 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20  _TEMP_STORE     
13470 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20  db->temp_store  
13480 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74     Location of t
13490 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
134a0 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
134b0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
134c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
134d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
134e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
134f0 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
13500 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
13520 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
13530 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
13570 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
135a0 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
135b0 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20  turn 1).**   1  
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
135e0 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
135f0 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
13600 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
13610 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
13620 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
13630 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
13640 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
13650 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
13660 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
13670 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
13680 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
13690 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
136b0 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
136c0 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20   1).**   3      
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
136e0 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
136f0 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
13700 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71  urn 1).*/.int sq
13710 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
13720 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20  y(const sqlite3 
13730 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *db){.#if SQLITE
13740 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20  _TEMP_STORE==1. 
13750 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
13760 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23  mp_store==2 );.#
13770 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13780 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20  _TEMP_STORE==2. 
13790 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
137a0 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23  mp_store!=1 );.#
137b0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
137c0 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20  _TEMP_STORE==3. 
137d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
137e0 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(db);.  return 
137f0 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  1;.#endif.#if SQ
13800 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c  LITE_TEMP_STORE<
13810 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50  1 || SQLITE_TEMP
13820 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53 45  _STORE>3.  UNUSE
13830 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
13840 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
13850 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
13860 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  urn UTF-8 encode
13870 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
13880 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
13890 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
138a0 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
138b0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
138c0 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65  e3_errmsg(sqlite
138d0 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20  3 *db){.  const 
138e0 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21  char *z;.  if( !
138f0 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
13900 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
13910 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13920 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
13930 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
13940 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
13950 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
13960 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
13970 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
13980 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
13990 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
139a0 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
139b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
139c0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
139d0 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
139e0 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b  _BKPT);.  }else{
139f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64  .    testcase( d
13a00 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20  b->pErr==0 );.  
13a10 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c    z = (char*)sql
13a20 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
13a30 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61  db->pErr);.    a
13a40 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
13a50 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
13a60 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
13a70 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
13a80 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
13a90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
13aa0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13ab0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
13ac0 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
13ad0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13ae0 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74  _UTF16./*.** Ret
13af0 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64  urn UTF-16 encod
13b00 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
13b10 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
13b20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
13b30 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
13b40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
13b50 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c  te3_errmsg16(sql
13b60 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61  ite3 *db){.  sta
13b70 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75  tic const u16 ou
13b80 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20  tOfMem[] = {.   
13b90 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
13ba0 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27  ' ', 'o', 'f', '
13bb0 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d   ', 'm', 'e', 'm
13bc0 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27  ', 'o', 'r', 'y'
13bd0 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  , 0.  };.  stati
13be0 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75  c const u16 misu
13bf0 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 62 27  se[] = {.    'b'
13c00 2c 20 27 61 27 2c 20 27 64 27 2c 20 27 20 27 2c  , 'a', 'd', ' ',
13c10 20 27 70 27 2c 20 27 61 27 2c 20 27 72 27 2c 20   'p', 'a', 'r', 
13c20 27 61 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27  'a', 'm', 'e', '
13c30 74 27 2c 20 27 65 27 2c 20 27 72 27 2c 20 27 20  t', 'e', 'r', ' 
13c40 27 2c 0a 20 20 20 20 27 6f 27 2c 20 27 72 27 2c  ',.    'o', 'r',
13c50 20 27 20 27 2c 20 27 6f 27 2c 20 27 74 27 2c 20   ' ', 'o', 't', 
13c60 27 68 27 2c 20 27 65 27 2c 20 27 72 27 2c 20 27  'h', 'e', 'r', '
13c70 20 27 2c 20 27 41 27 2c 20 27 50 27 2c 20 27 49   ', 'A', 'P', 'I
13c80 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6d 27 2c  ', ' ',.    'm',
13c90 20 27 69 27 2c 20 27 73 27 2c 20 27 75 27 2c 20   'i', 's', 'u', 
13ca0 27 73 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b  's', 'e', 0.  };
13cb0 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ..  const void *
13cc0 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
13cd0 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
13ce0 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d   *)outOfMem;.  }
13cf0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
13d00 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
13d10 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
13d20 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73  turn (void *)mis
13d30 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  use;.  }.  sqlit
13d40 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
13d50 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
13d60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13d70 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f  d ){.    z = (vo
13d80 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
13d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
13da0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13db0 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
13dc0 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
13dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13de0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64 62  orWithMsg(db, db
13df0 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69 74  ->errCode, sqlit
13e00 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
13e10 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a 20  Code));.      z 
13e20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13e30 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
13e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
13e50 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
13e60 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
13e70 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
13e80 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
13e90 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
13ea0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
13eb0 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
13ec0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13ed0 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
13ee0 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
13ef0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
13f00 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
13f10 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
13f20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
13f30 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
13f40 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
13f50 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
13f60 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
13f70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
13f80 74 65 33 4f 6f 6d 43 6c 65 61 72 28 64 62 29 3b  te3OomClear(db);
13f90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
13fa0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
13fb0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
13fc0 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
13fd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
13fe0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
13ff0 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
14000 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e  t error code gen
14010 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c  erated by an SQL
14020 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20  ite routine. If 
14030 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65  NULL is.** passe
14040 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
14050 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20  on, we assume a 
14060 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
14070 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  during sqlite3_o
14080 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pen()..*/.int sq
14090 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71  lite3_errcode(sq
140a0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
140b0 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33  ( db && !sqlite3
140c0 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
140d0 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
140e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
140f0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
14100 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d  if( !db || db->m
14110 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14130 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
14140 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
14150 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d  rCode & db->errM
14160 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ask;.}.int sqlit
14170 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
14180 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
14190 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
141a0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
141b0 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
141c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
141d0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
141e0 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
141f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14200 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
14210 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14220 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
14230 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 69  db->errCode;.}.i
14240 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 73 74 65  nt sqlite3_syste
14250 6d 5f 65 72 72 6e 6f 28 73 71 6c 69 74 65 33 20  m_errno(sqlite3 
14260 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
14270 62 20 3f 20 64 62 2d 3e 69 53 79 73 45 72 72 6e  b ? db->iSysErrn
14280 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a  o : 0;.}  ../*.*
14290 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
142a0 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
142b0 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
142c0 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
142d0 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
142e0 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20    For now, this 
142f0 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65  simply calls the
14300 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65   internal sqlite
14310 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e  3ErrStr().** fun
14320 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
14330 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
14340 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rstr(int rc){.  
14350 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
14360 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  rStr(rc);.}../*.
14370 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
14380 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
14390 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  on for database 
143a0 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20  "db".  The name 
143b0 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20  is zName.** and 
143c0 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
143d0 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  enc..*/.static i
143e0 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  nt createCollati
143f0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
14400 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
14410 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e  *zName, .  u8 en
14420 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  c,.  void* pCtx,
14430 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
14440 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
14450 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
14460 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
14470 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
14480 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
14490 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a  ll;.  int enc2;.
144a0 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
144b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
144c0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
144d0 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
144e0 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
144f0 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
14500 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
14510 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
14520 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
14530 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
14540 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
14550 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
14560 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
14570 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
14580 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
14590 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
145a0 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
145b0 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
145c0 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
145d0 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
145e0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
145f0 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
14600 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
14610 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
14620 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
14630 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
14640 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
14650 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
14660 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
14670 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
14680 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14690 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
146a0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
146b0 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
146c0 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
146d0 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
146e0 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
146f0 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
14700 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
14710 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
14720 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
14730 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
14740 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
14750 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
14760 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
14770 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
14780 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
14790 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
147a0 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
147b0 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
147c0 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
147d0 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
147e0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ive ){.      sql
147f0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
14800 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
14810 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
14820 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
14830 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ify collation se
14840 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63  quence due to ac
14850 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
14860 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14870 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
14880 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
14890 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
148a0 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 0a  ements(db, 0);..
148b0 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74      /* If collat
148c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
148d0 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64  ll was created d
148e0 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c  irectly by a cal
148f0 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
14900 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
14910 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65  tion, and not ge
14920 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68  nerated by synth
14930 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a  CollSeq(),.    *
14940 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65  * then any copie
14950 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43  s made by synthC
14960 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f  ollSeq() need to
14970 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e   be invalidated.
14980 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f  .    ** Also, co
14990 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74  llation destruct
149a0 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65  or - CollSeq.xDe
149b0 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d  l() - function m
149c0 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  ay need.    ** t
149d0 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20  o be called..   
149e0 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43   */ .    if( (pC
149f0 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49  oll->enc & ~SQLI
14a00 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
14a10 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20  )==enc2 ){.     
14a20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20   CollSeq *aColl 
14a30 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
14a40 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
14a50 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69   zName);.      i
14a60 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
14a70 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a  j=0; j<3; j++){.
14a80 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
14a90 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a  *p = &aColl[j];.
14aa0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
14ab0 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
14ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
14ad0 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20  p->xDel ){.     
14ae0 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70         p->xDel(p
14af0 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20  ->pUser);.      
14b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14b10 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20  p->xCmp = 0;.   
14b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14b30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c     }.  }..  pCol
14b40 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
14b50 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
14b60 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a  nc2, zName, 1);.
14b70 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
14b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14b90 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 43 6f  OMEM_BKPT;.  pCo
14ba0 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70  ll->xCmp = xComp
14bb0 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55  are;.  pColl->pU
14bc0 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43  ser = pCtx;.  pC
14bd0 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c  oll->xDel = xDel
14be0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d  ;.  pColl->enc =
14bf0 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e   (u8)(enc2 | (en
14c00 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c & SQLITE_UTF16
14c10 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71  _ALIGNED));.  sq
14c20 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
14c30 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74  QLITE_OK);.  ret
14c40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14c50 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72  .../*.** This ar
14c60 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64  ray defines hard
14c70 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e   upper bounds on
14c80 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20   limit values.  
14c90 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  The.** initializ
14ca0 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20  er must be kept 
14cb0 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
14cc0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a   SQLITE_LIMIT_*.
14cd0 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73  ** #defines in s
14ce0 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61  qlite3.h..*/.sta
14cf0 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48  tic const int aH
14d00 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  ardLimit[] = {. 
14d10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
14d20 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
14d30 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _SQL_LENGTH,.  S
14d40 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
14d50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ,.  SQLITE_MAX_E
14d60 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  XPR_DEPTH,.  SQL
14d70 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
14d80 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54  _SELECT,.  SQLIT
14d90 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20  E_MAX_VDBE_OP,. 
14da0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
14db0 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49  TION_ARG,.  SQLI
14dc0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
14dd0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  .  SQLITE_MAX_LI
14de0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
14df0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
14e00 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
14e10 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
14e20 33 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20  38091-32352 */. 
14e30 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
14e40 47 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  GER_DEPTH,.  SQL
14e50 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
14e60 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  HREADS,.};../*.*
14e70 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14e80 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20  hard limits are 
14e90 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c  set to reasonabl
14ea0 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20  e values.*/.#if 
14eb0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
14ec0 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
14ed0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
14ee0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
14ef0 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
14f00 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
14f10 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
14f20 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
14f30 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
14f40 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
14f50 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
14f60 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51  AX_SQL_LENGTH>SQ
14f70 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
14f80 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
14f90 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
14fa0 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65  st not be greate
14fb0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41  r than SQLITE_MA
14fc0 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a  X_LENGTH.#endif.
14fd0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
14fe0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32  OMPOUND_SELECT<2
14ff0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
15000 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
15010 45 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ECT must be at l
15020 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69  east 2.#endif.#i
15030 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  f SQLITE_MAX_VDB
15040 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20  E_OP<40.# error 
15050 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
15060 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  OP must be at le
15070 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69  ast 40.#endif.#i
15080 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  f SQLITE_MAX_FUN
15090 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53  CTION_ARG<0 || S
150a0 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
150b0 4f 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65 72 72  ON_ARG>127.# err
150c0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  or SQLITE_MAX_FU
150d0 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20  NCTION_ARG must 
150e0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
150f0 20 31 32 37 0a 23 65 6e 64 69 66 0a 23 69 66 20   127.#endif.#if 
15100 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15110 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  HED<0 || SQLITE_
15120 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35  MAX_ATTACHED>125
15130 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
15140 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73  MAX_ATTACHED mus
15150 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
15160 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69  nd 125.#endif.#i
15170 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  f SQLITE_MAX_LIK
15180 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
15190 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
151a0 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
151b0 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  RN_LENGTH must b
151c0 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
151d0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
151e0 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a  AX_COLUMN>32767.
151f0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
15200 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e  AX_COLUMN must n
15210 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a  ot exceed 32767.
15220 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
15230 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
15240 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  PTH<1.# error SQ
15250 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
15260 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61  _DEPTH must be a
15270 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
15280 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15290 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30  WORKER_THREADS<0
152a0 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57   || SQLITE_MAX_W
152b0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30  ORKER_THREADS>50
152c0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
152d0 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
152e0 44 53 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  DS must be betwe
152f0 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64  en 0 and 50.#end
15300 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
15310 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
15320 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
15330 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
15340 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
15350 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
15360 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
15370 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
15380 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
15390 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
153a0 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
153b0 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
153c0 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
153d0 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
153e0 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
153f0 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
15400 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
15410 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
15420 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
15430 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
15440 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
15450 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
15460 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
15470 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
15480 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
15490 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23  int oldLimit;..#
154a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
154b0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
154c0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
154d0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
154e0 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
154f0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
15500 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
15510 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
15520 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30  VIDENCE-OF: R-30
15530 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61  189-54097 For ea
15540 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72  ch limit categor
15550 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e  y SQLITE_LIMIT_N
15560 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  AME.  ** there i
15570 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62  s a hard upper b
15580 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70  ound set at comp
15590 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20  ile-time by a C 
155a0 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a  preprocessor.  *
155b0 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53  * macro called S
155c0 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20  QLITE_MAX_NAME. 
155d0 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69  (The "_LIMIT_" i
155e0 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68  n the name is ch
155f0 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f  anged to.  ** "_
15600 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61  MAX_".).  */.  a
15610 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15620 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
15630 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
15640 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  AX_LENGTH );.  a
15650 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15660 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53  t[SQLITE_LIMIT_S
15670 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49  QL_LENGTH]==SQLI
15680 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
15690 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
156a0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
156b0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d  _LIMIT_COLUMN]==
156c0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
156d0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  N );.  assert( a
156e0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
156f0 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
15700 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45  H]==SQLITE_MAX_E
15710 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  XPR_DEPTH );.  a
15720 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
15730 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
15740 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d  OMPOUND_SELECT]=
15750 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50  =SQLITE_MAX_COMP
15760 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20  OUND_SELECT);.  
15770 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
15780 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
15790 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45  VDBE_OP]==SQLITE
157a0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a  _MAX_VDBE_OP );.
157b0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
157c0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
157d0 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d  T_FUNCTION_ARG]=
157e0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  =SQLITE_MAX_FUNC
157f0 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73  TION_ARG );.  as
15800 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
15810 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54  [SQLITE_LIMIT_AT
15820 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f  TACHED]==SQLITE_
15830 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a  MAX_ATTACHED );.
15840 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15850 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15860 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
15870 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20  ENGTH]==.       
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d          SQLITE_M
158b0 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
158c0 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
158d0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
158e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
158f0 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51  ABLE_NUMBER]==SQ
15900 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
15910 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73  E_NUMBER);.  ass
15920 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
15930 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
15940 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  GGER_DEPTH]==SQL
15950 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
15960 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
15970 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
15980 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
15990 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49  R_THREADS]==SQLI
159a0 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
159b0 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72  READS );.  asser
159c0 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  t( SQLITE_LIMIT_
159d0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d  WORKER_THREADS==
159e0 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d  (SQLITE_N_LIMIT-
159f0 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69  1) );...  if( li
15a00 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74  mitId<0 || limit
15a10 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d  Id>=SQLITE_N_LIM
15a20 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
15a30 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69   -1;.  }.  oldLi
15a40 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  mit = db->aLimit
15a50 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28  [limitId];.  if(
15a60 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20   newLimit>=0 ){ 
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37    /* IMP: R-5247
15a90 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69  6-28732 */.    i
15aa0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72  f( newLimit>aHar
15ab0 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  dLimit[limitId] 
15ac0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  ){.      newLimi
15ad0 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c  t = aHardLimit[l
15ae0 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50  imitId];  /* IMP
15af0 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20  : R-51463-25634 
15b00 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  */.    }.    db-
15b10 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
15b20 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d   = newLimit;.  }
15b30 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d  .  return oldLim
15b40 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
15b50 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
15b60 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f  R-53341-35419 */
15b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
15b80 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
15b90 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52  to parse both UR
15ba0 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66  Is and non-URI f
15bb0 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20  ilenames passed 
15bc0 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74  by the.** user t
15bd0 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20  o API functions 
15be0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f  sqlite3_open() o
15bf0 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
15c00 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74  2(), and for dat
15c10 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70  abase.** URIs sp
15c20 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
15c30 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d  of ATTACH statem
15c40 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
15c50 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
15c60 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
15c70 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
15c80 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f  he VFS to use (o
15c90 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73  r.** a NULL to s
15ca0 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75  ignify the defau
15cb0 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55  lt VFS) if the U
15cc0 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  RI does not cont
15cd0 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a  ain a "vfs=xxx".
15ce0 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
15cf0 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  er. The second a
15d00 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
15d10 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e   the URI (or non
15d20 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a  -URI filename).*
15d30 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74  * itself. When t
15d40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15d50 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61  called the *pFla
15d60 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  gs variable shou
15d70 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68  ld contain.** th
15d80 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20  e default flags 
15d90 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
15da0 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68  base handle with
15db0 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72  . The value stor
15dc0 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73  ed in.** *pFlags
15dd0 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20   may be updated 
15de0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
15df0 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65   if the URI file
15e00 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a  name contains .*
15e10 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72  * "cache=xxx" or
15e20 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72   "mode=xxx" quer
15e30 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a  y parameters..**
15e40 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
15e50 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
15e60 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
15e70 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73  s case *ppVfs is
15e80 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
15e90 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74  .** the VFS that
15ea0 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
15eb0 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
15ec0 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69  base file. *pzFi
15ed0 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  le is set to.** 
15ee0 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
15ef0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
15f00 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
15f10 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73  e to open. It is
15f20 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
15f30 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
15f40 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
15f50 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  lly call sqlite3
15f60 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
15f70 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
15f80 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
15f90 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
15fa0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
15fb0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
15fc0 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67  ed and *pzErrMsg
15fd0 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74  .** may be set t
15fe0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
15ff0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
16000 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
16010 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  ge error .** mes
16020 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
16030 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
16040 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
16050 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
16060 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
16070 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  r by calling sql
16080 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
16090 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65  int sqlite3Parse
160a0 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  Uri(.  const cha
160b0 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20  r *zDefaultVfs, 
160c0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f         /* VFS to
160d0 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d   use if no "vfs=
160e0 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f  xxx" query optio
160f0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
16100 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20  r *zUri,        
16110 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
16120 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20  rminated URI to 
16130 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  parse */.  unsig
16140 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  ned int *pFlags,
16150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
16160 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45  /OUT: SQLITE_OPE
16170 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  N_XXX flags */. 
16180 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70   sqlite3_vfs **p
16190 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
161a0 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20   /* OUT: VFS to 
161b0 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a  use */ .  char *
161c0 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20  *pzFile,        
161d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
161e0 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f  : Filename compo
161f0 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20  nent of URI */. 
16200 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
16230 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53  essage (if rc!=S
16240 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a  QLITE_OK) */.){.
16250 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16260 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
16270 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46   int flags = *pF
16280 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lags;.  const ch
16290 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61  ar *zVfs = zDefa
162a0 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a  ultVfs;.  char *
162b0 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b  zFile;.  char c;
162c0 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71  .  int nUri = sq
162d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
162e0 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ri);..  assert( 
162f0 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a  *pzErrMsg==0 );.
16300 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26  .  if( ((flags &
16310 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
16320 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  )             /*
16330 20 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33 32   IMP: R-48725-32
16340 32 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  206 */.         
16350 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f     || sqlite3Glo
16360 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
16370 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ri) /* IMP: R-51
16380 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20  689-46548 */.   
16390 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65  && nUri>=5 && me
163a0 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65  mcmp(zUri, "file
163b0 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50  :", 5)==0 /* IMP
163c0 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20  : R-57884-37496 
163d0 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  */.  ){.    char
163e0 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20   *zOpt;.    int 
163f0 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
16400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
16410 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70  ser state when p
16420 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20  arsing URI */.  
16430 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20    int iIn;      
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16450 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74  /* Input charact
16460 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
16470 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16490 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65   Output characte
164a0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75  r index */.    u
164b0 36 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b  64 nByte = nUri+
164c0 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
164d0 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
164e0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
164f0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
16500 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
16510 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20  URI flag is set 
16520 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74  to indicate to t
16530 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20  he VFS xOpen .  
16540 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74    ** method that
16550 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78   there may be ex
16560 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66  tra parameters f
16570 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c  ollowing the fil
16580 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e-name.  */.    
16590 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
165a0 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66  OPEN_URI;..    f
165b0 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55  or(iIn=0; iIn<nU
165c0 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65  ri; iIn++) nByte
165d0 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d   += (zUri[iIn]==
165e0 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  '&');.    zFile 
165f0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
16600 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  64(nByte);.    i
16610 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
16620 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
16630 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49 6e 20 3d  BKPT;..    iIn =
16640 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   5;.#ifdef SQLIT
16650 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48  E_ALLOW_URI_AUTH
16660 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20 73 74  ORITY.    if( st
16670 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f  rncmp(zUri+5, "/
16680 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  //", 3)==0 ){.  
16690 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
166a0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
166b0 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61  ing condition ca
166c0 75 73 65 73 20 55 52 49 73 20 77 69 74 68 20 66  uses URIs with f
166d0 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68  ive leading / ch
166e0 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a  aracters.      *
166f0 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f  * like file:////
16700 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65  /host/path to be
16710 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
16720 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74  UNCs like //host
16730 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  /path..      ** 
16740 54 68 65 20 63 6f 72 72 65 63 74 20 55 52 49 20  The correct URI 
16750 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61 73  for that UNC has
16760 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75   only two or fou
16770 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72  r leading / char
16780 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  acters.      ** 
16790 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68  file://host/path
167a0 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73   or file:////hos
167b0 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c  t/path.  But 5 l
167c0 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69  eading slashes i
167d0 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  s a .      ** co
167e0 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61  mmon error, we a
167f0 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68  re told, so we h
16800 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73 70  andle it as a sp
16810 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20  ecial case. */. 
16820 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
16830 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20  (zUri+7, "///", 
16840 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20  3)==0 ){ iIn++; 
16850 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
16860 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20  strncmp(zUri+5, 
16870 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20  "//localhost/", 
16880 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  12)==0 ){.      
16890 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a  iIn = 16;.    }.
168a0 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69 73  #else.    /* Dis
168b0 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
168c0 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
168d0 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
168e0 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
168f0 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
16900 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
16910 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
16920 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
16930 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
16940 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='/' ) iIn++;. 
16950 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
16960 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
16970 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
16980 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
16990 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
169a0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
169b0 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
169c0 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
169d0 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
169e0 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
169f0 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
16a00 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
16a10 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
16a20 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
16a30 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
16a40 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  f..    /* Copy t
16a50 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
16a60 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65  any query parame
16a70 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46  ters into the zF
16a80 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20  ile buffer. .   
16a90 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65   ** Decode %HH e
16aa0 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e  scape codes alon
16ab0 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20  g the way. .    
16ac0 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e  **.    ** Within
16ad0 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69   this loop, vari
16ae0 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20  able eState may 
16af0 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f  be set to 0, 1 o
16b00 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20  r 2, depending. 
16b10 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72     ** on the par
16b20 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73  sing context. As
16b30 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
16b40 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72  .    **   0: Par
16b50 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a  sing file-name..
16b60 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73      **   1: Pars
16b70 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e  ing name section
16b80 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
16b90 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
16ba0 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61  ..    **   2: Pa
16bb0 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74  rsing value sect
16bc0 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
16bd0 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
16be0 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ter..    */.    
16bf0 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
16c00 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
16c10 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
16c20 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '#' ){.      iIn
16c30 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
16c40 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20  ='%' .       && 
16c50 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
16c60 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20  zUri[iIn]) .    
16c70 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
16c80 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31  digit(zUri[iIn+1
16c90 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ]) .      ){.   
16ca0 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d       int octet =
16cb0 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e   (sqlite3HexToIn
16cc0 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c  t(zUri[iIn++]) <
16cd0 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63  < 4);.        oc
16ce0 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65  tet += sqlite3He
16cf0 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
16d00 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  +]);..        as
16d10 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26  sert( octet>=0 &
16d20 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20  & octet<256 );. 
16d30 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74         if( octet
16d40 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
16d50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 52 49  QLITE_ENABLE_URI
16d60 5f 30 30 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  _00_ERROR.      
16d70 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
16d80 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
16d90 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
16da0 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
16db0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
16dc0 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
16dd0 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
16de0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
16df0 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
16e00 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
16e10 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
16e20 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
16e30 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
16e40 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
16e50 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
16e60 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
16e70 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
16e80 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
16e90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
16ea0 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
16eb0 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
16ec0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16ed0 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
16ee0 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
16ef0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
16f00 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
16f10 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
16f20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
16f30 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
16f40 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
16f50 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
16f60 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
16f70 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
16f80 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  e;.#else.       
16f90 20 20 20 2f 2a 20 49 66 20 45 4e 41 42 4c 45 5f     /* If ENABLE_
16fa0 55 52 49 5f 30 30 5f 45 52 52 4f 52 20 69 73 20  URI_00_ERROR is 
16fb0 64 65 66 69 6e 65 64 2c 20 22 25 30 30 22 20 69  defined, "%00" i
16fc0 6e 20 61 20 55 52 49 20 69 73 20 61 6e 20 65 72  n a URI is an er
16fd0 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ror. */.        
16fe0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
16ff0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75  lite3_mprintf("u
17000 6e 65 78 70 65 63 74 65 64 20 25 25 30 30 20 69  nexpected %%00 i
17010 6e 20 75 72 69 22 29 3b 0a 20 20 20 20 20 20 20  n uri");.       
17020 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
17030 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
17040 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
17050 75 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ut;.#endif.     
17060 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
17070 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65   octet;.      }e
17080 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d  lse if( eState==
17090 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20  1 && (c=='&' || 
170a0 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  c=='=') ){.     
170b0 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75     if( zFile[iOu
170c0 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1]==0 ){.     
170d0 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79       /* An empty
170e0 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67   option name. Ig
170f0 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
17100 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a   altogether. */.
17110 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
17120 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
17130 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20  ri[iIn]!='#' && 
17140 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27  zUri[iIn-1]!='&'
17150 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
17160 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
17170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17180 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20  if( c=='&' ){.  
17190 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f          zFile[iO
171a0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
171b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
171c0 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
171d0 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
171e0 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
171f0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74    }else if( (eSt
17200 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27  ate==0 && c=='?'
17210 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20  ) || (eState==2 
17220 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20  && c=='&') ){.  
17230 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
17240 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b       eState = 1;
17250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
17260 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63  File[iOut++] = c
17270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17280 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c  eState==1 ) zFil
17290 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
172a0 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
172b0 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
172c0 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
172d0 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  '\0';..    /* Ch
172e0 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72  eck if there wer
172f0 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70  e any options sp
17300 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f  ecified that sho
17310 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74  uld be interpret
17320 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e  ed .    ** here.
17330 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72   Options that ar
17340 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65  e interpreted he
17350 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22  re include "vfs"
17360 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a   and those that.
17370 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
17380 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20  d to flags that 
17390 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f  may be passed to
173a0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65   the sqlite3_ope
173b0 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65  n_v2().    ** me
173c0 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70  thod. */.    zOp
173d0 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74  t = &zFile[sqlit
173e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
173f0 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
17400 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20   zOpt[0] ){.    
17410 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c    int nOpt = sql
17420 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
17430 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t);.      char *
17440 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70  zVal = &zOpt[nOp
17450 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  t+1];.      int 
17460 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nVal = sqlite3St
17470 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20  rlen30(zVal);.. 
17480 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33       if( nOpt==3
17490 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22   && memcmp("vfs"
174a0 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b  , zOpt, 3)==0 ){
174b0 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20  .        zVfs = 
174c0 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  zVal;.      }els
174d0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
174e0 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20  t OpenMode {.   
174f0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
17500 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  r *z;.          
17510 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  int mode;.      
17520 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a    } *aMode = 0;.
17530 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
17540 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20  odeType = 0;.   
17550 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
17560 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
17570 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  imit = 0;..     
17580 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26     if( nOpt==5 &
17590 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22  & memcmp("cache"
175a0 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b  , zOpt, 5)==0 ){
175b0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
175c0 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
175d0 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d  e aCacheMode[] =
175e0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
175f0 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49   "shared",  SQLI
17600 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
17610 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
17620 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20     { "private", 
17630 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
17640 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
17650 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
17660 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
17670 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
17680 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
17690 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f  EDCACHE|SQLITE_O
176a0 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
176b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
176c0 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a  e = aCacheMode;.
176d0 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
176e0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  = mask;.        
176f0 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63    zModeType = "c
17700 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d  ache";.        }
17710 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
17720 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==4 && memcmp("
17730 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d  mode", zOpt, 4)=
17740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17750 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
17760 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65  enMode aOpenMode
17770 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
17780 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49     { "ro",  SQLI
17790 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
177a0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
177b0 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f  { "rw",  SQLITE_
177c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d  OPEN_READWRITE }
177d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  , .            {
177e0 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f   "rwc", SQLITE_O
177f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
17800 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
17810 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  TE },.          
17820 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51    { "memory", SQ
17830 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
17840 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
17850 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
17860 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
17870 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
17880 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53  PEN_READONLY | S
17890 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
178a0 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
178b0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
178c0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
178d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
178e0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  Y;.          aMo
178f0 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a  de = aOpenMode;.
17900 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
17910 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a  = mask & flags;.
17920 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
17930 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a  ype = "access";.
17940 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17950 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a     if( aMode ){.
17960 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
17970 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
17980 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
17990 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64     for(i=0; aMod
179a0 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20  e[i].z; i++){.  
179b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
179c0 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b  char *z = aMode[
179d0 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  i].z;.          
179e0 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69    if( nVal==sqli
179f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26  te3Strlen30(z) &
17a00 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c  & 0==memcmp(zVal
17a10 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20  , z, nVal) ){.  
17a20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
17a30 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65   = aMode[i].mode
17a40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17a50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
17a60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
17a70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
17a80 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
17a90 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
17aa0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
17ab0 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f  f("no such %s mo
17ac0 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79  de: %s", zModeTy
17ad0 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
17ae0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
17af0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
17b00 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
17b10 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
17b20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17b30 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c  if( (mode & ~SQL
17b40 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
17b50 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
17b60 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
17b70 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
17b80 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61  f("%s mode not a
17b90 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20  llowed: %s",.   
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20       zModeType, 
17bd0 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
17be0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
17bf0 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERM;.           
17c00 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
17c10 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
17c20 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
17c30 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73   = (flags & ~mas
17c40 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20  k) | mode;.     
17c50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
17c60 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c      zOpt = &zVal
17c70 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a  [nVal+1];.    }.
17c80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46  .  }else{.    zF
17c90 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
17ca0 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b 0a  lloc64(nUri+2);.
17cb0 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
17cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
17cd0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 69  OMEM_BKPT;.    i
17ce0 66 28 20 6e 55 72 69 20 29 7b 0a 20 20 20 20 20  f( nUri ){.     
17cf0 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a   memcpy(zFile, z
17d00 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
17d10 7d 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  }.    zFile[nUri
17d20 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
17d30 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c  ile[nUri+1] = '\
17d40 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  0';.    flags &=
17d50 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
17d60 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73  I;.  }..  *ppVfs
17d70 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
17d80 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
17d90 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20   *ppVfs==0 ){.  
17da0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
17db0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
17dc0 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
17dd0 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d   zVfs);.    rc =
17de0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17df0 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75   }. parse_uri_ou
17e00 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
17e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
17e20 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
17e30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30  );.    zFile = 0
17e40 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20  ;.  }.  *pFlags 
17e50 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69  = flags;.  *pzFi
17e60 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65  le = zFile;.  re
17e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
17e80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17e90 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
17ea0 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62   opening a datab
17eb0 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66  ase on behalf of
17ec0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
17ed0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f  () and sqlite3_o
17ee0 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74  pen16(). The dat
17ef0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22  abase filename "
17f00 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20  zFilename"  .** 
17f10 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  is UTF-8 encoded
17f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17f30 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20  openDatabase(.  
17f40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
17f50 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61  ename, /* Databa
17f60 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d  se filename UTF-
17f70 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73  8 encoded */.  s
17f80 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
17f90 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
17fa0 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20  turned database 
17fb0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  handle */.  unsi
17fc0 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20  gned int flags, 
17fd0 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61     /* Operationa
17fe0 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  l flags */.  con
17ff0 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
18000 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
18010 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  he VFS to use */
18020 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
18030 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
18040 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61        /* Store a
18050 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20  llocated handle 
18060 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
18070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18090 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
180a0 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20  t isThreadsafe; 
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
180c0 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64   True for thread
180d0 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  safe connections
180e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65   */.  char *zOpe
180f0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
18100 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
18110 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  e argument to pa
18120 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28  ss to BtreeOpen(
18130 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  ) */.  char *zEr
18140 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rMsg = 0;       
18150 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
18160 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c  message from sql
18170 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a  ite3ParseUri() *
18180 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
18190 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
181a0 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
181b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
181c0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
181d0 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
181e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
181f0 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
18200 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
18210 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
18220 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18230 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
18240 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18250 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30  ig.bCoreMutex==0
18260 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
18270 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
18280 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
18290 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
182a0 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
182b0 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
182c0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
182d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
182e0 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
182f0 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20  readsafe = 1;.  
18300 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72  }else{.    isThr
18310 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65  eadsafe = sqlite
18320 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
18330 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 0a 20  ullMutex;.  }.. 
18340 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
18350 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
18360 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
18370 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
18380 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
18390 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
183a0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
183b0 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
183c0 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
183d0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
183e0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
183f0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
18400 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
18410 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
18420 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
18430 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
18440 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
18450 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
18460 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
18470 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
18480 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
18490 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
184a0 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
184b0 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
184c0 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
184d0 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
184e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
184f0 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
18500 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
18510 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
18520 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
18530 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
18540 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
18550 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
18560 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
18570 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
18580 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
18590 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
185a0 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
185b0 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
185c0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
185d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
185e0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
185f0 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
18600 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18610 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
18620 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18630 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
18640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18650 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
18660 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
18670 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18680 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
18690 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
186a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
186b0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
186c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
186d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
186e0 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
186f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18700 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
18710 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
18720 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18730 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
18740 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18750 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
18760 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
18770 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
18780 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
18790 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
187a0 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
187b0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
187c0 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
187d0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
187e0 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
187f0 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
18800 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
18810 69 73 54 68 72 65 61 64 73 61 66 65 20 0a 23 69  isThreadsafe .#i
18820 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18830 4c 45 5f 4d 55 4c 54 49 54 48 52 45 41 44 45 44  LE_MULTITHREADED
18840 5f 43 48 45 43 4b 53 0a 20 20 20 7c 7c 20 73 71  _CHECKS.   || sq
18850 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18860 67 2e 62 43 6f 72 65 4d 75 74 65 78 0a 23 65 6e  g.bCoreMutex.#en
18870 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 64 62 2d  dif.  ){.    db-
18880 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
18890 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
188a0 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
188b0 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
188c0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
188d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
188e0 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
188f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
18900 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
18910 20 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73     if( isThreads
18920 61 66 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  afe==0 ){.      
18930 73 71 6c 69 74 65 33 4d 75 74 65 78 57 61 72 6e  sqlite3MutexWarn
18940 4f 6e 43 6f 6e 74 65 6e 74 69 6f 6e 28 64 62 2d  OnContention(db-
18950 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
18960 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
18970 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
18980 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
18990 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
189a0 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
189b0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
189c0 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
189d0 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
189e0 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  atic;..  assert(
189f0 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
18a00 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72  it)==sizeof(aHar
18a10 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d  dLimit) );.  mem
18a20 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20  cpy(db->aLimit, 
18a30 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65  aHardLimit, size
18a40 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b  of(db->aLimit));
18a50 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  .  db->aLimit[SQ
18a60 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
18a70 52 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c  R_THREADS] = SQL
18a80 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b  ITE_DEFAULT_WORK
18a90 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62  ER_THREADS;.  db
18aa0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
18ab0 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f  ;.  db->nextAuto
18ac0 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e  vac = -1;.  db->
18ad0 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33  szMmap = sqlite3
18ae0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
18af0 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50  map;.  db->nextP
18b00 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64  agesize = 0;.  d
18b10 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61  b->nMaxSorterMma
18b20 70 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a  p = 0x7FFFFFFF;.
18b30 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
18b40 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
18b50 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61  mes | SQLITE_Ena
18b60 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c  bleTrigger | SQL
18b70 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23  ITE_CacheSpill.#
18b80 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
18b90 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  TE_DEFAULT_AUTOM
18ba0 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53  ATIC_INDEX) || S
18bb0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
18bc0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20  TOMATIC_INDEX.  
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18be0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
18bf0 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  x.#endif.#if SQL
18c00 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54  ITE_DEFAULT_CKPT
18c10 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20  FULLFSYNC.      
18c20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
18c30 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e  ITE_CkptFullFSyn
18c40 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  c.#endif.#if SQL
18c50 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
18c60 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20  _FORMAT<4.      
18c70 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
18c80 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
18c90 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  t.#endif.#ifdef 
18ca0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
18cb0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18cd0 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
18ce0 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20  sion.#endif.#if 
18cf0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52  SQLITE_DEFAULT_R
18d00 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52  ECURSIVE_TRIGGER
18d10 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S.              
18d20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54     | SQLITE_RecT
18d30 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23  riggers.#endif.#
18d40 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
18d50 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
18d60 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54  N_KEYS) && SQLIT
18d70 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
18d80 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20  N_KEYS.         
18d90 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
18da0 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e  _ForeignKeys.#en
18db0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
18dc0 53 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55  SQLITE_REVERSE_U
18dd0 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53  NORDERED_SELECTS
18de0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
18df0 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65     | SQLITE_Reve
18e00 72 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a  rseOrder.#endif.
18e10 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18e20 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
18e30 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e50 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a  | SQLITE_CellSiz
18e60 65 43 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  eCk.#endif.#if d
18e70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
18e80 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49  ABLE_FTS3_TOKENI
18e90 5a 45 52 29 0a 20 20 20 20 20 20 20 20 20 20 20  ZER).           
18ea0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
18eb0 74 73 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e  ts3Tokenizer.#en
18ec0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
18ed0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 51 50  SQLITE_ENABLE_QP
18ee0 53 47 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  SG).            
18ef0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 45 6e       | SQLITE_En
18f00 61 62 6c 65 51 50 53 47 0a 23 65 6e 64 69 66 0a  ableQPSG.#endif.
18f10 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65        ;.  sqlite
18f20 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
18f30 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
18f40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18f50 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
18f60 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
18f70 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
18f80 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
18f90 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
18fa0 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
18fb0 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
18fc0 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
18fd0 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
18fe0 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
18ff0 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
19000 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
19010 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
19020 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
19030 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
19040 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
19050 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
19060 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e    **.  ** EVIDEN
19070 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34  CE-OF: R-52786-4
19080 34 38 37 38 20 53 51 4c 69 74 65 20 64 65 66 69  4878 SQLite defi
19090 6e 65 73 20 74 68 72 65 65 20 62 75 69 6c 74 2d  nes three built-
190a0 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a  in collating.  *
190b0 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a  * functions:.  *
190c0 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
190d0 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53  ion(db, sqlite3S
190e0 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45  trBINARY, SQLITE
190f0 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
19100 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
19110 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
19120 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
19130 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  Y, SQLITE_UTF16B
19140 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
19150 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
19160 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c  ollation(db, sql
19170 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53  ite3StrBINARY, S
19180 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
19190 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
191a0 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
191b0 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45  tion(db, "NOCASE
191c0 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
191d0 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  0, nocaseCollati
191e0 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  ngFunc, 0);.  cr
191f0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
19200 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54  , "RTRIM", SQLIT
19210 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31  E_UTF8, (void*)1
19220 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
19230 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
19240 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
19250 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
19260 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45  ;.  }.  /* EVIDE
19270 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d  NCE-OF: R-08308-
19280 31 37 32 32 34 20 54 68 65 20 64 65 66 61 75 6c  17224 The defaul
19290 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
192a0 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a  tion for all.  *
192b0 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42 49 4e  * strings is BIN
192c0 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ARY. .  */.  db-
192d0 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
192e0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
192f0 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
19300 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
19310 59 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  Y, 0);.  assert(
19320 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d   db->pDfltColl!=
19330 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65  0 );..  /* Parse
19340 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52   the filename/UR
19350 49 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 0a  I argument.  **.
19360 20 20 2a 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    ** Only allow 
19370 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  sensible combina
19380 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e  tions of bits in
19390 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   the flags argum
193a0 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f  ent.  .  ** Thro
193b0 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  w an error if an
193c0 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62  y non-sense comb
193d0 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  ination is used.
193e0 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20    If we.  ** do 
193f0 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61  not block illega
19400 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68  l combinations h
19410 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72  ere, it could tr
19420 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72  igger.  ** asser
19430 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
19440 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e  n deeper layers.
19450 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69    Sensible combi
19460 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65  nations.  ** are
19470 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20  :.  **.  **  1: 
19480 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
19490 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20  DONLY.  **  2:  
194a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
194b0 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20  WRITE.  **  6:  
194c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
194d0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
194e0 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a  PEN_CREATE.  */.
194f0 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20    db->openFlags 
19500 3d 20 66 6c 61 67 73 3b 0a 20 20 61 73 73 65 72  = flags;.  asser
19510 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
19520 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31  EADONLY  == 0x01
19530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
19540 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
19550 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20  ITE == 0x02 );. 
19560 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
19570 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d  OPEN_CREATE    =
19580 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74  = 0x04 );.  test
19590 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
195a0 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a  &7))==0x02 ); /*
195b0 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74   READONLY */.  t
195c0 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
195d0 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b  ags&7))==0x04 );
195e0 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f   /* READWRITE */
195f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
19600 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34  <(flags&7))==0x4
19610 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  0 ); /* READWRIT
19620 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20  E | CREATE */.  
19630 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26  if( ((1<<(flags&
19640 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29  7)) & 0x46)==0 )
19650 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19660 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20  E_MISUSE_BKPT;  
19670 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d  /* IMP: R-65497-
19680 34 34 35 39 34 20 2a 2f 0a 20 20 7d 65 6c 73 65  44594 */.  }else
19690 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
196a0 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c  e3ParseUri(zVfs,
196b0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61   zFilename, &fla
196c0 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26  gs, &db->pVfs, &
196d0 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29  zOpen, &zErrMsg)
196e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
196f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19700 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19710 4e 4f 4d 45 4d 20 29 20 73 71 6c 69 74 65 33 4f  NOMEM ) sqlite3O
19720 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
19730 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
19740 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72  hMsg(db, rc, zEr
19750 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c  rMsg ? "%s" : 0,
19760 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
19770 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
19780 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  Msg);.    goto o
19790 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
197a0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61    /* Open the ba
197b0 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64  ckend database d
197c0 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20  river */.  rc = 
197d0 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
197e0 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e  (db->pVfs, zOpen
197f0 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30  , db, &db->aDb[0
19800 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20  ].pBt, 0,.      
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45    flags | SQLITE
19830 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a  _OPEN_MAIN_DB);.
19840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19850 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
19860 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
19870 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72  NOMEM ){.      r
19880 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19890 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
198a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
198b0 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , rc);.    goto 
198c0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
198d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
198e0 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ter(db->aDb[0].p
198f0 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  Bt);.  db->aDb[0
19900 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
19910 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
19920 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29   db->aDb[0].pBt)
19930 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ;.  if( !db->mal
19940 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28  locFailed ) ENC(
19950 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43  db) = SCHEMA_ENC
19960 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
19970 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44  treeLeave(db->aD
19980 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
19990 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
199a0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
199b0 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a  et(db, 0);..  /*
199c0 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66   The default saf
199d0 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety_level for th
199e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
199f0 69 73 20 46 55 4c 4c 3b 20 66 6f 72 20 74 68 65  is FULL; for the
19a00 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
19a10 61 73 65 20 69 74 20 69 73 20 4f 46 46 2e 20 54  ase it is OFF. T
19a20 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
19a30 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61  pager layer defa
19a40 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64  ults.  .  */.  d
19a50 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61  b->aDb[0].zDbSNa
19a60 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
19a70 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
19a80 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f  _level = SQLITE_
19a90 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
19aa0 4f 55 53 2b 31 3b 0a 20 20 64 62 2d 3e 61 44 62  OUS+1;.  db->aDb
19ab0 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22  [1].zDbSName = "
19ac0 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62  temp";.  db->aDb
19ad0 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [1].safety_level
19ae0 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   = PAGER_SYNCHRO
19af0 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d  NOUS_OFF;..  db-
19b00 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
19b10 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
19b20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19b30 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
19b40 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
19b50 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
19b60 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
19b70 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
19b80 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
19b90 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
19ba0 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
19bb0 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
19bc0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
19bd0 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
19be0 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
19bf0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
19c00 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
19c10 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  E_OK);.  sqlite3
19c20 52 65 67 69 73 74 65 72 50 65 72 43 6f 6e 6e 65  RegisterPerConne
19c30 63 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63  ctionBuiltinFunc
19c40 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20  tions(db);.  rc 
19c50 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
19c60 65 28 64 62 29 3b 0a 0a 23 69 66 64 65 66 20 53  e(db);..#ifdef S
19c70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
19c80 35 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  5.  /* Register 
19c90 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 46 54 53  any built-in FTS
19ca0 35 20 6d 6f 64 75 6c 65 20 62 65 66 6f 72 65 20  5 module before 
19cb0 6c 6f 61 64 69 6e 67 20 74 68 65 20 61 75 74 6f  loading the auto
19cc0 6d 61 74 69 63 0a 20 20 2a 2a 20 65 78 74 65 6e  matic.  ** exten
19cd0 73 69 6f 6e 73 2e 20 54 68 69 73 20 61 6c 6c 6f  sions. This allo
19ce0 77 73 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ws automatic ext
19cf0 65 6e 73 69 6f 6e 73 20 74 6f 20 72 65 67 69 73  ensions to regis
19d00 74 65 72 20 46 54 53 35 20 0a 20 20 2a 2a 20 74  ter FTS5 .  ** t
19d10 6f 6b 65 6e 69 7a 65 72 73 20 61 6e 64 20 61 75  okenizers and au
19d20 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
19d30 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  s.  */.  if( !db
19d40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
19d50 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
19d60 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19d70 74 65 33 46 74 73 35 49 6e 69 74 28 64 62 29 3b  te3Fts5Init(db);
19d80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
19d90 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63  * Load automatic
19da0 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78   extensions - ex
19db0 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61  tensions that ha
19dc0 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  ve been register
19dd0 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  ed.  ** using th
19de0 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61  e sqlite3_automa
19df0 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20  tic_extension() 
19e00 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  API..  */.  if( 
19e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19e20 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
19e30 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
19e40 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
19e50 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
19e60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
19e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19e80 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
19e90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
19ea0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19eb0 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
19ec0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19ed0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
19ee0 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
19ef0 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
19f00 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
19f10 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
19f20 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
19f30 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
19f40 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
19f50 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
19f60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19f70 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
19f80 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
19f90 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
19fa0 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
19fb0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
19fc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19fd0 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75 74  ABLE_FTS3 /* aut
19fe0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e  omatically defin
19ff0 65 64 20 62 79 20 53 51 4c 49 54 45 5f 45 4e 41  ed by SQLITE_ENA
1a000 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66  BLE_FTS4 */.  if
1a010 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a020 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
1a030 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1a040 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
1a050 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1a060 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1a070 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 29  LITE_ENABLE_ICU)
1a080 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1a090 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f 43 4f  TE_ENABLE_ICU_CO
1a0a0 4c 4c 41 54 49 4f 4e 53 29 0a 20 20 69 66 28 20  LLATIONS).  if( 
1a0b0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1a0c0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1a0d0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1a0e0 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
1a0f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a100 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a110 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
1a120 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1a130 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
1a140 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
1a150 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
1a160 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1a170 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a180 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42  ABLE_DBPAGE_VTAB
1a190 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
1a1a0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
1a1b0 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
1a1c0 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 70 61  rc = sqlite3Dbpa
1a1d0 67 65 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a  geRegister(db);.
1a1e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1a1f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a200 5f 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20 69  _DBSTAT_VTAB.  i
1a210 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1a220 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1a230 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
1a240 20 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65   sqlite3DbstatRe
1a250 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a  gister(db);.  }.
1a260 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1a270 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f  QLITE_ENABLE_JSO
1a280 4e 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  N1.  if( !db->ma
1a290 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1a2a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
1a2b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 73    rc = sqlite3Js
1a2c0 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  on1Init(db);.  }
1a2d0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1a2e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1a2f0 4d 54 56 54 41 42 0a 20 20 69 66 28 20 21 64 62  MTVTAB.  if( !db
1a300 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
1a310 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
1a320 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1a330 65 33 53 74 6d 74 56 74 61 62 49 6e 69 74 28 64  e3StmtVtabInit(d
1a340 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1a350 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
1a360 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
1a370 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
1a380 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
1a390 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
1a3a0 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
1a3b0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
1a3c0 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
1a3d0 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
1a3e0 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
1a3f0 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
1a400 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
1a410 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
1a420 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
1a430 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1a440 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
1a450 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
1a460 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1a470 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
1a480 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
1a490 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
1a4a0 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
1a4b0 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
1a4e0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
1a4f0 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  E);.#endif..  if
1a500 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72  ( rc ) sqlite3Er
1a510 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20  ror(db, rc);..  
1a520 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
1a530 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
1a540 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
1a550 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
1a560 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
1a570 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
1a580 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1a5a0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a5b0 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
1a5c0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
1a5d0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
1a5e0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
1a5f0 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
1a600 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
1a610 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
1a620 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
1a630 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
1a640 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20  dsafe==0.       
1a650 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
1a660 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
1a670 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
1a680 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a690 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1a6a0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1a6b0 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
1a6c0 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
1a6d0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
1a6e0 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  MEM );.  if( rc=
1a6f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
1a700 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
1a710 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
1a720 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
1a730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a740 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1a750 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
1a760 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20  CK;.  }.  *ppDb 
1a770 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c  = db;.#ifdef SQL
1a780 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
1a790 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
1a7a0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
1a7b0 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  log ){.    /* Op
1a7c0 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c  ening a db handl
1a7d0 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
1a7e0 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e  ter is passed 0.
1a7f0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41   */.    void *pA
1a800 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  rg = sqlite3Glob
1a810 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
1a820 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
1a830 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
1a840 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a  llog(pArg, db, z
1a850 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
1a860 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
1a870 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
1a880 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72 63 3d  CODEC).  if( rc=
1a890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a8a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
1a8b0 65 79 3b 0a 20 20 20 20 69 66 28 20 28 7a 4b 65  ey;.    if( (zKe
1a8c0 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  y = sqlite3_uri_
1a8d0 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c  parameter(zOpen,
1a8e0 20 22 68 65 78 6b 65 79 22 29 29 21 3d 30 20 26   "hexkey"))!=0 &
1a8f0 26 20 7a 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20  & zKey[0] ){.   
1a900 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20     u8 iByte;.   
1a910 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1a920 63 68 61 72 20 7a 44 65 63 6f 64 65 64 5b 34 30  char zDecoded[40
1a930 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ];.      for(i=0
1a940 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a  , iByte=0; i<siz
1a950 65 6f 66 28 7a 44 65 63 6f 64 65 64 29 2a 32 20  eof(zDecoded)*2 
1a960 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
1a970 69 74 28 7a 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b  it(zKey[i]); i++
1a980 29 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74 65  ){.        iByte
1a990 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20   = (iByte<<4) + 
1a9a0 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
1a9b0 7a 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zKey[i]);.      
1a9c0 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20 29    if( (i&1)!=0 )
1a9d0 20 7a 44 65 63 6f 64 65 64 5b 69 2f 32 5d 20 3d   zDecoded[i/2] =
1a9e0 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a   iByte;.      }.
1a9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65        sqlite3_ke
1aa00 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a 44 65 63  y_v2(db, 0, zDec
1aa10 6f 64 65 64 2c 20 69 2f 32 29 3b 0a 20 20 20 20  oded, i/2);.    
1aa20 7d 65 6c 73 65 20 69 66 28 20 28 7a 4b 65 79 20  }else if( (zKey 
1aa30 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
1aa40 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20 22  rameter(zOpen, "
1aa50 6b 65 79 22 29 29 21 3d 30 20 29 7b 0a 20 20 20  key"))!=0 ){.   
1aa60 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76     sqlite3_key_v
1aa70 32 28 64 62 2c 20 30 2c 20 7a 4b 65 79 2c 20 73  2(db, 0, zKey, s
1aa80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1aa90 4b 65 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Key));.    }.  }
1aaa0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1aab0 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20  3_free(zOpen);. 
1aac0 20 72 65 74 75 72 6e 20 72 63 20 26 20 30 78 66   return rc & 0xf
1aad0 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  f;.}../*.** Open
1aae0 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
1aaf0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
1ab00 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63  qlite3_open(.  c
1ab10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1ab20 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
1ab30 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65   **ppDb .){.  re
1ab40 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
1ab50 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44  e(zFilename, ppD
1ab60 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1ab70 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1ab80 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1ab90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1aba0 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  ATE, 0);.}.int s
1abb0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a  qlite3_open_v2(.
1abc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
1abd0 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74  lename,   /* Dat
1abe0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28  abase filename (
1abf0 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
1ac00 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
1ac10 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69      /* OUT: SQLi
1ac20 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  te db handle */.
1ac30 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
1ac40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1ac50 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
1ac60 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20  ar *zVfs        
1ac70 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d  /* Name of VFS m
1ac80 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a  odule to use */.
1ac90 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
1aca0 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d  Database(filenam
1acb0 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e  e, ppDb, (unsign
1acc0 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56  ed int)flags, zV
1acd0 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  fs);.}..#ifndef 
1ace0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1acf0 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  6./*.** Open a n
1ad00 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
1ad10 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1ad20 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e  e3_open16(.  con
1ad30 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
1ad40 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
1ad50 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20  *ppDb.){.  char 
1ad60 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65  const *zFilename
1ad70 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d  8;   /* zFilenam
1ad80 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  e encoded in UTF
1ad90 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54  -8 instead of UT
1ada0 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-16 */.  sqlite
1adb0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
1adc0 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
1add0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1ade0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70  PI_ARMOR.  if( p
1adf0 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pDb==0 ) return 
1ae00 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1ae10 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70  PT;.#endif.  *pp
1ae20 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
1ae30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ae40 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
1ae50 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1ae60 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1ae70 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
1ae80 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
1ae90 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  0 ) zFilename = 
1aea0 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20 70 56  "\000\000";.  pV
1aeb0 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
1aec0 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
1aed0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
1aee0 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
1aef0 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
1af00 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
1af10 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
1af20 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
1af30 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
1af40 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
1af50 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
1af60 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
1af70 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
1af80 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1afa0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1afb0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1afc0 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
1afd0 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
1afe0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
1aff0 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
1b000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1b010 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
1b020 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
1b030 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
1b040 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 2a 70 70    SCHEMA_ENC(*pp
1b050 44 62 29 20 3d 20 45 4e 43 28 2a 70 70 44 62 29  Db) = ENC(*ppDb)
1b060 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
1b070 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  ATIVE;.    }.  }
1b080 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1b090 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1b0a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1b0b0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
1b0c0 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 30  .  return rc & 0
1b0d0 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  xff;.}.#endif /*
1b0e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1b0f0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
1b100 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
1b110 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
1b120 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1b130 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
1b140 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
1b150 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  e_collation(.  s
1b160 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
1b170 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1b180 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
1b190 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
1b1a0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
1b1b0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
1b1c0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
1b1d0 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  id*).){.  return
1b1e0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1b1f0 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
1b200 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74   zName, enc, pCt
1b210 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
1b220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
1b230 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
1b240 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
1b250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1b260 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
1b270 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
1b280 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73  ollation_v2(.  s
1b290 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
1b2a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1b2b0 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
1b2c0 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
1b2d0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
1b2e0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
1b2f0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
1b300 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
1b310 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
1b320 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20  int rc;..#ifdef 
1b330 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1b340 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1b350 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1b360 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
1b370 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1b380 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1b390 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1b3a0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1b3b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
1b3c0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
1b3d0 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
1b3e0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
1b3f0 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
1b400 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
1b410 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20  re, xDel);.  rc 
1b420 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
1b430 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
1b440 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b450 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1b460 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1b470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b480 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
1b490 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
1b4a0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
1b4b0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1b4c0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
1b4d0 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
1b4e0 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20  _collation16(.  
1b4f0 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
1b500 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
1b510 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  e,.  int enc, . 
1b520 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
1b530 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
1b540 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
1b550 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
1b560 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
1b570 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b580 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23  char *zName8;..#
1b590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1b5a0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1b5b0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1b5c0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
1b5d0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
1b5e0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1b5f0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1b600 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1b610 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1b620 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
1b630 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1b640 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65   zName8 = sqlite
1b650 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e  3Utf16to8(db, zN
1b660 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
1b670 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
1b680 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20  if( zName8 ){.  
1b690 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
1b6a0 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
1b6b0 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  8, (u8)enc, pCtx
1b6c0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
1b6d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1b6e0 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20  e(db, zName8);. 
1b6f0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1b700 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
1b710 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1b720 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1b730 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1b740 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1b750 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1b760 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
1b770 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
1b780 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
1b790 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
1b7a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1b7b0 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
1b7c0 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
1b7d0 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
1b7e0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
1b7f0 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
1b800 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
1b810 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20  eded(.  sqlite3 
1b820 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
1b830 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
1b840 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
1b850 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  ed)(void*,sqlite
1b860 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
1b870 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
1b880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b890 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1b8a0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1b8b0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1b8c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1b8d0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1b8e0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1b8f0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1b900 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
1b910 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65  Needed = xCollNe
1b920 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  eded;.  db->xCol
1b930 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20  lNeeded16 = 0;. 
1b940 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
1b950 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
1b960 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
1b970 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1b980 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1b990 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1b9a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b9b0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
1b9c0 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
1b9d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1b9e0 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
1b9f0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1ba00 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
1ba10 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
1ba20 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
1ba30 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1ba40 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
1ba50 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
1ba60 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20  ion_needed16(.  
1ba70 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
1ba80 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
1ba90 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
1baa0 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f  CollNeeded16)(vo
1bab0 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
1bac0 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
1bad0 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65 66  void*).){.#ifdef
1bae0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1baf0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1bb00 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1bb10 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1bb20 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1bb30 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1bb40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1bb50 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1bb60 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
1bb70 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c   = 0;.  db->xCol
1bb80 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c  lNeeded16 = xCol
1bb90 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d  lNeeded16;.  db-
1bba0 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
1bbb0 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
1bbc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1bbd0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1bbe0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1bbf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1bc00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1bc10 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
1bc20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
1bc30 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
1bc40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1bc50 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69  now an anachroni
1bc60 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  sm. It used to b
1bc70 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65  e used to recove
1bc80 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c  r from a.** mall
1bc90 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75  oc() failure, bu
1bca0 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65  t SQLite now doe
1bcb0 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63  s this automatic
1bcc0 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
1bcd0 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
1bce0 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ver(void){.  ret
1bcf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1bd00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1bd10 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
1bd20 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61  er or not the da
1bd30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1bd40 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  n is in autocomm
1bd50 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74  it.** mode.  Ret
1bd60 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1bd70 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
1bd80 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  ot.  Autocommit 
1bd90 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79  mode is on.** by
1bda0 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63   default.  Autoc
1bdb0 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65  ommit is disable
1bdc0 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61  d by a BEGIN sta
1bdd0 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61  tement and reena
1bde0 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e  bled.** by the n
1bdf0 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  ext COMMIT or RO
1be00 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  LLBACK..*/.int s
1be10 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
1be20 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
1be30 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
1be40 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1be50 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1be60 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1be70 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
1be80 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1be90 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
1bea0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
1beb0 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
1bec0 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
1bed0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1bee0 74 69 6e 65 73 20 61 72 65 20 73 75 62 73 74 69  tines are substi
1bef0 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61  tutes for consta
1bf00 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  nts SQLITE_CORRU
1bf10 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  PT,.** SQLITE_MI
1bf20 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  SUSE, SQLITE_CAN
1bf30 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 4e 4f  TOPEN, SQLITE_NO
1bf40 4d 45 4d 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  MEM and possibly
1bf50 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
1bf60 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79  constants.  They
1bf70 20 73 65 72 76 65 20 74 77 6f 20 70 75 72 70 6f   serve two purpo
1bf80 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
1bf90 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
1bfa0 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
1bfb0 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
1bfc0 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
1bfd0 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
1bfe0 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
1bff0 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
1c000 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
1c010 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
1c020 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
1c030 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
1c040 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
1c050 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
1c060 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
1c070 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
1c080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52  .*/.int sqlite3R
1c090 65 70 6f 72 74 45 72 72 6f 72 28 69 6e 74 20 69  eportError(int i
1c0a0 45 72 72 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  Err, int lineno,
1c0b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1c0c0 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  pe){.  sqlite3_l
1c0d0 6f 67 28 69 45 72 72 2c 20 22 25 73 20 61 74 20  og(iErr, "%s at 
1c0e0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
1c0f0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
1c100 20 20 20 7a 54 79 70 65 2c 20 6c 69 6e 65 6e 6f     zType, lineno
1c110 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75  , 20+sqlite3_sou
1c120 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75  rceid());.  retu
1c130 72 6e 20 69 45 72 72 3b 0a 7d 0a 69 6e 74 20 73  rn iErr;.}.int s
1c140 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72  qlite3CorruptErr
1c150 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1c160 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1c170 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c180 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1c190 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72  urn sqlite3Repor
1c1a0 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f  tError(SQLITE_CO
1c1b0 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 22  RRUPT, lineno, "
1c1c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1c1d0 69 6f 6e 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  ion");.}.int sql
1c1e0 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
1c1f0 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
1c200 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1c210 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
1c220 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  g!=0 );.  return
1c230 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72   sqlite3ReportEr
1c240 72 6f 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  ror(SQLITE_MISUS
1c250 45 2c 20 6c 69 6e 65 6e 6f 2c 20 22 6d 69 73 75  E, lineno, "misu
1c260 73 65 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  se");.}.int sqli
1c270 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72  te3CantopenError
1c280 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
1c290 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1c2a0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1c2b0 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  og!=0 );.  retur
1c2c0 6e 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45  n sqlite3ReportE
1c2d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1c2e0 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f 2c 20 22 63  OPEN, lineno, "c
1c2f0 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 22  annot open file"
1c300 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
1c310 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
1c320 69 74 65 33 43 6f 72 72 75 70 74 50 67 6e 6f 45  ite3CorruptPgnoE
1c330 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 2c  rror(int lineno,
1c340 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 63   Pgno pgno){.  c
1c350 68 61 72 20 7a 4d 73 67 5b 31 30 30 5d 3b 0a 20  har zMsg[100];. 
1c360 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1c370 66 28 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20  f(sizeof(zMsg), 
1c380 7a 4d 73 67 2c 20 22 64 61 74 61 62 61 73 65 20  zMsg, "database 
1c390 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65 20  corruption page 
1c3a0 25 64 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 74 65  %d", pgno);.  te
1c3b0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1c3c0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1c3d0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1c3e0 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72  sqlite3ReportErr
1c3f0 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  or(SQLITE_CORRUP
1c400 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 4d 73 67 29  T, lineno, zMsg)
1c410 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  ;.}.int sqlite3N
1c420 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69  omemError(int li
1c430 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1c440 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1c450 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1c460 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1c470 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1c480 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65  LITE_NOMEM, line
1c490 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a 7d 0a 69 6e  no, "OOM");.}.in
1c4a0 74 20 73 71 6c 69 74 65 33 49 6f 65 72 72 6e 6f  t sqlite3Ioerrno
1c4b0 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  memError(int lin
1c4c0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1c4d0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1c4e0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1c4f0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c500 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1c510 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 2c  ITE_IOERR_NOMEM,
1c520 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f 4f 20 4f 4f   lineno, "I/O OO
1c530 4d 20 65 72 72 6f 72 22 29 3b 0a 7d 0a 23 65 6e  M error");.}.#en
1c540 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1c550 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
1c560 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  TED./*.** This i
1c570 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  s a convenience 
1c580 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b  routine that mak
1c590 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  es sure that all
1c5a0 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
1c5b0 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69  .** data for thi
1c5c0 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65  s thread has bee
1c5d0 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  n deallocated..*
1c5e0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c  *.** SQLite no l
1c5f0 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61  onger uses threa
1c600 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d-specific data 
1c610 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
1c620 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f  is now a.** no-o
1c630 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e  p.  It is retain
1c640 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  ed for historica
1c650 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  l compatibility.
1c660 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c670 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
1c680 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a  void){.}.#endif.
1c690 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65  ./*.** Return me
1c6a0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ta information a
1c6b0 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20  bout a specific 
1c6c0 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61  column of a data
1c6d0 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53  base table..** S
1c6e0 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71  ee comment in sq
1c6f0 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e  lite3.h (sqlite.
1c700 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c  h.in) for detail
1c710 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1c720 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
1c730 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
1c740 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1c750 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1c760 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
1c770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1c780 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
1c790 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
1c7a0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
1c7b0 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
1c7c0 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
1c7d0 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
1c7e0 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
1c7f0 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
1c800 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
1c810 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
1c820 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
1c830 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
1c840 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
1c850 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
1c860 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1c870 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
1c880 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
1c890 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
1c8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
1c8b0 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
1c8c0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
1c8d0 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
1c8e0 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
1c8f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1c900 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
1c910 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
1c920 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
1c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c940 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1c950 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
1c960 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
1c970 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1c980 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
1c990 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
1c9a0 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
1c9b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
1c9c0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
1c9d0 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20  st *zDataType = 
1c9e0 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
1c9f0 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20  *zCollSeq = 0;. 
1ca00 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30   int notnull = 0
1ca10 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b  ;.  int primaryk
1ca20 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75  ey = 0;.  int au
1ca30 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69 66  toinc = 0;...#if
1ca40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ca50 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1ca60 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1ca70 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1ca80 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a  TableName==0 ){.
1ca90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1caa0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1cab0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1cac0 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62  Ensure the datab
1cad0 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62  ase schema has b
1cae0 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20  een loaded */.  
1caf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1cb00 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1cb10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1cb20 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63  terAll(db);.  rc
1cb30 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
1cb40 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  b, &zErrMsg);.  
1cb50 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1cb60 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72  c ){.    goto er
1cb70 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
1cb80 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  /* Locate the ta
1cb90 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  ble in question 
1cba0 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  */.  pTab = sqli
1cbb0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1cbc0 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62   zTableName, zDb
1cbd0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54  Name);.  if( !pT
1cbe0 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  ab || pTab->pSel
1cbf0 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20  ect ){.    pTab 
1cc00 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  = 0;.    goto er
1cc10 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
1cc20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75  /* Find the colu
1cc30 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66  mn for which inf
1cc40 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a  o is requested *
1cc50 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e  /.  if( zColumnN
1cc60 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
1cc70 20 51 75 65 72 79 20 66 6f 72 20 65 78 69 73 74   Query for exist
1cc80 61 6e 63 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e  ance of table on
1cc90 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ly */.  }else{. 
1cca0 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
1ccb0 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
1ccc0 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70  iCol++){.      p
1ccd0 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
1cce0 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iCol];.      i
1ccf0 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
1cd00 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
1cd10 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  , zColumnName) )
1cd20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1cd30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cd40 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61     if( iCol==pTa
1cd50 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
1cd60 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
1cd70 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 49 73  ab) && sqlite3Is
1cd80 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
1cd90 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  e) ){.        iC
1cda0 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
1cdb0 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d  ;.        pCol =
1cdc0 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62   iCol>=0 ? &pTab
1cdd0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30  ->aCol[iCol] : 0
1cde0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1cdf0 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b         pTab = 0;
1ce00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72  .        goto er
1ce10 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ror_out;.      }
1ce20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1ce30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
1ce40 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20  lock stores the 
1ce50 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
1ce60 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
1ce70 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74  turned.  ** to t
1ce80 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63  he caller in loc
1ce90 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61  al variables zDa
1cea0 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71  taType, zCollSeq
1ceb0 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61  , notnull, prima
1cec0 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61  rykey.  ** and a
1ced0 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20  utoinc. At this 
1cee0 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20  point there are 
1cef0 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65  two possibilitie
1cf00 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  s:.  ** .  **   
1cf10 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69    1. The specifi
1cf20 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  ed column name w
1cf30 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22  as rowid", "oid"
1cf40 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20   or "_rowid_" . 
1cf50 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74   **        and t
1cf60 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69  here is no expli
1cf70 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49  citly declared I
1cf80 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a  PK column. .  **
1cf90 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  .  **     2. The
1cfa0 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
1cfb0 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c  view and the col
1cfc0 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66  umn name identif
1cfd0 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20  ied an .  **    
1cfe0 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64      explicitly d
1cff0 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20  eclared column. 
1d000 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d  Copy meta inform
1d010 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c  ation from *pCol
1d020 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43  ..  */ .  if( pC
1d030 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54  ol ){.    zDataT
1d040 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  ype = sqlite3Col
1d050 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 30 29 3b  umnType(pCol,0);
1d060 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
1d070 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20  pCol->zColl;.   
1d080 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d   notnull = pCol-
1d090 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20  >notNull!=0;.   
1d0a0 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28   primarykey  = (
1d0b0 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
1d0c0 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
1d0d0 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  )!=0;.    autoin
1d0e0 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
1d0f0 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
1d100 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
1d110 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
1d120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
1d130 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
1d140 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
1d150 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
1d160 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
1d170 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 73      zCollSeq = s
1d180 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1d190 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  .  }..error_out:
1d1a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1d1b0 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
1d1c0 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66  /* Whether the f
1d1d0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63  unction call suc
1d1e0 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64  ceeded or failed
1d1f0 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  , set the output
1d200 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a   parameters.  **
1d210 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65   to whatever the
1d220 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72  ir local counter
1d230 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49  parts contain. I
1d240 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f  f an error did o
1d250 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20  ccur,.  ** this 
1d260 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
1d270 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75  f zeroing all ou
1d280 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
1d290 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61  .  */.  if( pzDa
1d2a0 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61  taType ) *pzData
1d2b0 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65  Type = zDataType
1d2c0 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65  ;.  if( pzCollSe
1d2d0 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d  q ) *pzCollSeq =
1d2e0 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28   zCollSeq;.  if(
1d2f0 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f   pNotNull ) *pNo
1d300 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b  tNull = notnull;
1d310 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b  .  if( pPrimaryK
1d320 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65  ey ) *pPrimaryKe
1d330 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  y = primarykey;.
1d340 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29    if( pAutoinc )
1d350 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74   *pAutoinc = aut
1d360 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c  oinc;..  if( SQL
1d370 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70  ITE_OK==rc && !p
1d380 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
1d390 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1d3a0 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d  rMsg);.    zErrM
1d3b0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
1d3c0 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68  ntf(db, "no such
1d3d0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25   table column: %
1d3e0 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d  s.%s", zTableNam
1d3f0 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  e,.        zColu
1d400 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  mnName);.    rc 
1d410 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1d420 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1d430 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
1d440 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a  , (zErrMsg?"%s":
1d450 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0), zErrMsg);.  
1d460 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d470 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63  , zErrMsg);.  rc
1d480 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
1d490 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
1d4a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1d4b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1d4c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d4d0 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
1d4e0 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
1d4f0 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
1d500 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
1d510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c  /.int sqlite3_sl
1d520 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73  eep(int ms){.  s
1d530 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1d540 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56  ;.  int rc;.  pV
1d550 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
1d560 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
1d570 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e  pVfs==0 ) return
1d580 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
1d590 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e  unction works in
1d5a0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62   milliseconds, b
1d5b0 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ut the underlyin
1d5c0 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a  g OsSleep() .  *
1d5d0 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f  * API uses micro
1d5e0 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74  seconds. Hence t
1d5f0 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a  he 1000's..  */.
1d600 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f    rc = (sqlite3O
1d610 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30  sSleep(pVfs, 100
1d620 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72  0*ms)/1000);.  r
1d630 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d640 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1d650 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65  able the extende
1d660 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a  d result codes..
1d670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
1d680 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
1d690 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  odes(sqlite3 *db
1d6a0 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69  , int onoff){.#i
1d6b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1d6c0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1d6d0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1d6e0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1d6f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1d700 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1d710 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1d720 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1d730 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
1d740 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66   = onoff ? 0xfff
1d750 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20  fffff : 0xff;.  
1d760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1d770 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1d780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d790 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  OK;.}../*.** Inv
1d7a0 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e  oke the xFileCon
1d7b0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61  trol method on a
1d7c0 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
1d7d0 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1d7e0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1d7f0 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  l(sqlite3 *db, c
1d800 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1d810 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  me, int op, void
1d820 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
1d830 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1d840 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  ;.  Btree *pBtre
1d850 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
1d860 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1d870 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1d880 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1d890 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1d8a0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1d8b0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1d8c0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1d8d0 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65  >mutex);.  pBtre
1d8e0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  e = sqlite3DbNam
1d8f0 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1d900 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74  Name);.  if( pBt
1d910 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ree ){.    Pager
1d920 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71   *pPager;.    sq
1d930 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
1d940 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d950 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1d960 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
1d970 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
1d980 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  tree);.    asser
1d990 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1d9a0 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33      fd = sqlite3
1d9b0 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
1d9c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  );.    assert( f
1d9d0 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
1d9e0 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1d9f0 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b  _FILE_POINTER ){
1da00 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1da10 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66  _file**)pArg = f
1da20 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  d;.      rc = SQ
1da30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1da40 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1da50 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e  E_FCNTL_VFS_POIN
1da60 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1da70 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70 41 72  qlite3_vfs**)pAr
1da80 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
1da90 56 66 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Vfs(pPager);.   
1daa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1dab0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1dac0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
1dad0 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54 45  L_JOURNAL_POINTE
1dae0 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1daf0 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
1db00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a   = sqlite3PagerJ
1db10 72 6e 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b  rnlFile(pPager);
1db20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1db30 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1db40 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1db50 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49  FCNTL_DATA_VERSI
1db60 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2a 28 75 6e  ON ){.      *(un
1db70 73 69 67 6e 65 64 20 69 6e 74 2a 29 70 41 72 67  signed int*)pArg
1db80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 44   = sqlite3PagerD
1db90 61 74 61 56 65 72 73 69 6f 6e 28 70 50 61 67 65  ataVersion(pPage
1dba0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1dbb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1dbc0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1dbd0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1dbe0 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72  trol(fd, op, pAr
1dbf0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
1dc00 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1dc10 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73  pBtree);.  }.  s
1dc20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1dc30 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1dc40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dc50 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
1dc60 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f  o the testing lo
1dc70 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  gic..*/.int sqli
1dc80 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1dc90 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
1dca0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66   int rc = 0;.#if
1dcb0 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53  def SQLITE_UNTES
1dcc0 54 41 42 4c 45 0a 20 20 55 4e 55 53 45 44 5f 50  TABLE.  UNUSED_P
1dcd0 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65  ARAMETER(op);.#e
1dce0 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  lse.  va_list ap
1dcf0 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1dd00 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
1dd10 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20  op ){..    /*.  
1dd20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75    ** Save the cu
1dd30 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
1dd40 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a  he PRNG..    */.
1dd50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1dd60 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
1dd70 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
1dd80 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74 65  te3PrngSaveState
1dd90 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
1dda0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1ddb0 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68     ** Restore th
1ddc0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  e state of the P
1ddd0 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20  RNG to the last 
1dde0 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69 6e  state saved usin
1ddf0 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41  g.    ** PRNG_SA
1de00 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56  VE.  If PRNG_SAV
1de10 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f  E has never befo
1de20 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  re been called, 
1de30 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  then.    ** this
1de40 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20   verb acts like 
1de50 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20  PRNG_RESET..    
1de60 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1de70 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
1de80 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20  _RESTORE: {.    
1de90 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73    sqlite3PrngRes
1dea0 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20  toreState();.   
1deb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dec0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
1ded0 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62 61  eset the PRNG ba
1dee0 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74  ck to its uninit
1def0 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20  ialized state.  
1df00 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20  The next call.  
1df10 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1df20 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c  randomness() wil
1df30 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e  l reseed the PRN
1df40 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  G using a single
1df50 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
1df60 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20  the xRandomness 
1df70 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65  method of the de
1df80 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a  fault VFS..    *
1df90 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1dfa0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1dfb0 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73  RESET: {.      s
1dfc0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1dfd0 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72  s(0,0);.      br
1dfe0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1dff0 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1e000 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e010 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a  BITVEC_TEST, siz
1e020 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20  e, program).    
1e030 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20  **.    ** Run a 
1e040 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20 42  test against a B
1e050 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20  itvec object of 
1e060 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72  size.  The progr
1e070 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20  am argument.    
1e080 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ** is an array o
1e090 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20  f integers that 
1e0a0 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73 74  defines the test
1e0b0 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20  .  Return -1 on 
1e0c0 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  a.    ** memory 
1e0d0 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
1e0e0 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  , 0 on success, 
1e0f0 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  or non-zero for 
1e100 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a  an error..    **
1e110 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33   See the sqlite3
1e120 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
1e130 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  t() for addition
1e140 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
1e150 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e160 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e170 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20  BITVEC_TEST: {. 
1e180 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61       int sz = va
1e190 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1e1a0 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20       int *aProg 
1e1b0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1e1c0 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  *);.      rc = s
1e1d0 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
1e1e0 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f  tinTest(sz, aPro
1e1f0 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
1e200 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1e210 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1e220 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c  est_control(FAUL
1e230 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c  T_INSTALL, xCall
1e240 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20  back).    **.   
1e250 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69   ** Arrange to i
1e260 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28  nvoke xCallback(
1e270 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74  ) whenever sqlit
1e280 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20  e3FaultSim() is 
1e290 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69  called,.    ** i
1e2a0 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e  f xCallback is n
1e2b0 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a  ot NULL..    **.
1e2c0 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74      ** As a test
1e2d0 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73 69   of the fault si
1e2e0 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73  mulator mechanis
1e2f0 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65  m itself, sqlite
1e300 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20  3FaultSim(0).   
1e310 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d   ** is called im
1e320 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
1e330 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e  installing the n
1e340 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20  ew callback and 
1e350 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  the return.    *
1e360 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c  * value from sql
1e370 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20  ite3FaultSim(0) 
1e380 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75  becomes the retu
1e390 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  rn from.    ** s
1e3a0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1e3b0 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  rol()..    */.  
1e3c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e3d0 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53  STCTRL_FAULT_INS
1e3e0 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TALL: {.      /*
1e3f0 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61   MSVC is picky a
1e400 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e  bout pulling fun
1e410 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c  c ptrs from va l
1e420 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68  ists..      ** h
1e430 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69  ttp://support.mi
1e440 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34  crosoft.com/kb/4
1e450 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71  7961.      ** sq
1e460 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e470 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20  g.xTestCallback 
1e480 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1e490 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  (*)(int));.     
1e4a0 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
1e4b0 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42  f int(*TESTCALLB
1e4c0 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b  ACKFUNC_t)(int);
1e4d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1e4e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74  obalConfig.xTest
1e4f0 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72  Callback = va_ar
1e500 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41  g(ap, TESTCALLBA
1e510 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20  CKFUNC_t);.     
1e520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75   rc = sqlite3Fau
1e530 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20  ltSim(0);.      
1e540 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e550 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1e560 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e570 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  l(BENIGN_MALLOC_
1e580 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78  HOOKS, xBegin, x
1e590 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  End).    **.    
1e5a0 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b  ** Register hook
1e5b0 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64  s to call to ind
1e5c0 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c  icate which mall
1e5d0 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20  oc() failures . 
1e5e0 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e     ** are benign
1e5f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e600 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e610 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
1e620 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74  HOOKS: {.      t
1e630 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f  ypedef void (*vo
1e640 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69  id_function)(voi
1e650 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  d);.      void_f
1e660 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42  unction xBenignB
1e670 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64  egin;.      void
1e680 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
1e690 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e  nEnd;.      xBen
1e6a0 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72  ignBegin = va_ar
1e6b0 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
1e6c0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e  ion);.      xBen
1e6d0 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28  ignEnd = va_arg(
1e6e0 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
1e6f0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1e700 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f  3BenignMallocHoo
1e710 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c  ks(xBenignBegin,
1e720 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20   xBenignEnd);.  
1e730 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e740 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1e750 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e760 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e770 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
1e780 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  TE, unsigned int
1e790 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
1e7a0 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e  * Set the PENDIN
1e7b0 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61  G byte to the va
1e7c0 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d  lue in the argum
1e7d0 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20  ent, if X>0..   
1e7e0 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e   ** Make no chan
1e7f0 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65  ges if X==0.  Re
1e800 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
1e810 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79  f the pending by
1e820 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20  te.    ** as it 
1e830 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20  existing before 
1e840 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1e850 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a   called..    **.
1e860 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54      ** IMPORTANT
1e870 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  :  Changing the 
1e880 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f  PENDING byte fro
1e890 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73  m 0x40000000 res
1e8a0 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61  ults in.    ** a
1e8b0 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64  n incompatible d
1e8c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1e8d0 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74  mat.  Changing t
1e8e0 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a  he PENDING byte.
1e8f0 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79      ** while any
1e900 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1e910 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73  tion is open res
1e920 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65  ults in undefine
1e930 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  d and.    ** del
1e940 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f  eterious behavio
1e950 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1e960 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1e970 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a  RL_PENDING_BYTE:
1e980 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45   {.      rc = PE
1e990 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e  NDING_BYTE;.#ifn
1e9a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e9b0 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  WSD.      {.    
1e9c0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
1e9d0 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67   newVal = va_arg
1e9e0 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
1e9f0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1ea00 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33  newVal ) sqlite3
1ea10 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65  PendingByte = ne
1ea20 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  wVal;.      }.#e
1ea30 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
1ea40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1ea50 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1ea60 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1ea70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1ea80 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  ERT, int X).    
1ea90 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1eaa0 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1eab0 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1eac0 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
1ead0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65   not.    ** asse
1eae0 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64  rt() was enabled
1eaf0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1eb00 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
1eb10 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20  and assert().   
1eb20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20   ** is enabled, 
1eb30 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
1eb40 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20  value is true.  
1eb50 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64  If X is true and
1eb60 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
1eb70 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
1eb80 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
1eb90 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66  lue is zero.  If
1eba0 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c   X is.    ** fal
1ebb0 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
1ebc0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
1ebd0 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66   the assertion f
1ebe0 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20  ires and the.   
1ebf0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72   ** process abor
1ec00 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c  ts.  If X is fal
1ec10 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
1ec20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
1ec30 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74  n the.    ** ret
1ec40 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1ec50 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  o..    */.    ca
1ec60 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ec70 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20  RL_ASSERT: {.   
1ec80 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20     volatile int 
1ec90 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  x = 0;.      ass
1eca0 65 72 74 28 20 2f 2a 73 69 64 65 2d 65 66 66 65  ert( /*side-effe
1ecb0 63 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20 76 61  cts-ok*/ (x = va
1ecc0 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30  _arg(ap,int))!=0
1ecd0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78   );.      rc = x
1ece0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ecf0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20     }...    /*.  
1ed00 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1ed10 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ed20 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1ed30 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  S, int X).    **
1ed40 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74  .    ** This act
1ed50 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72  ion provides a r
1ed60 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20  un-time test to 
1ed70 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41  see how the ALWA
1ed80 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45  YS and.    ** NE
1ed90 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20  VER macros were 
1eda0 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  defined at compi
1edb0 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a  le-time..    **.
1edc0 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72      ** The retur
1edd0 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59  n value is ALWAY
1ede0 53 28 58 29 20 69 66 20 58 20 69 73 20 74 72 75  S(X) if X is tru
1edf0 65 2c 20 6f 72 20 30 20 69 66 20 58 20 69 73 20  e, or 0 if X is 
1ee00 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  false..    **.  
1ee10 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65    ** The recomme
1ee20 6e 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d  nded test is X==
1ee30 32 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  2.  If the retur
1ee40 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68  n value is 2, th
1ee50 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  at means.    ** 
1ee60 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
1ee70 45 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f  ER() are both no
1ee80 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1ee90 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69   macros, which i
1eea0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  s the.    ** def
1eeb0 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49  ault setting.  I
1eec0 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
1eed0 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c  ue is 1, then AL
1eee0 57 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72  WAYS() is either
1eef0 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64  .    ** hard-cod
1ef00 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c  ed to true or el
1ef10 73 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66  se it asserts if
1ef20 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73   its argument is
1ef30 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54   false..    ** T
1ef40 68 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f  he first behavio
1ef50 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  r (hard-coded to
1ef60 20 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61   true) is the ca
1ef70 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
1ef80 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1ef90 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
1efa0 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1efb0 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f  led and the seco
1efc0 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69  nd.    ** behavi
1efd0 6f 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68  or (assert if th
1efe0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c  e argument to AL
1eff0 57 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29  WAYS() is false)
1f000 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
1f010 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
1f020 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
1f030 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
1f040 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  ) is enabled..  
1f050 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1f060 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72  run-time test pr
1f070 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f  ocedure might lo
1f080 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ok something lik
1f090 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
1f0a0 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c     **    if( sql
1f0b0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1f0c0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1f0d0 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20  L_ALWAYS, 2)==2 
1f0e0 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
1f0f0 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  / ALWAYS() and N
1f100 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70  EVER() are no-op
1f110 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
1f120 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d  cros.    **    }
1f130 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1f140 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1f150 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1f160 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20  SERT, 1) ){.    
1f170 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1f180 53 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61  S(x) asserts tha
1f190 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56  t x is true. NEV
1f1a0 45 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20  ER(x) asserts x 
1f1b0 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1f1c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a      }else{.    *
1f1d0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
1f1e0 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
1f1f0 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69  t 1.  NEVER(x) i
1f200 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a  s a constant 0..
1f210 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20      **    }.    
1f220 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f230 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
1f240 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  YS: {.      int 
1f250 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1f260 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78  t);.      rc = x
1f270 20 3f 20 41 4c 57 41 59 53 28 78 29 20 3a 20 30   ? ALWAYS(x) : 0
1f280 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f290 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1f2a0 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   **   sqlite3_te
1f2b0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1f2c0 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
1f2d0 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  RDER);.    **.  
1f2e0 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72    ** The integer
1f2f0 20 72 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c   returned reveal
1f300 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72  s the byte-order
1f310 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72   of the computer
1f320 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a   on which.    **
1f330 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69   SQLite is runni
1f340 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ng:.    **.    *
1f350 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 62 69  *       1     bi
1f360 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74  g-endian,    det
1f370 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
1f380 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ime.    **      
1f390 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e  10     little-en
1f3a0 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64  dian, determined
1f3b0 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20   at run-time.   
1f3c0 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20 20   **  432101     
1f3d0 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64  big-endian,    d
1f3e0 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d  etermined at com
1f3f0 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a  pile-time.    **
1f400 20 20 31 32 33 34 31 30 20 20 20 20 20 6c 69 74    123410     lit
1f410 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65  tle-endian, dete
1f420 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  rmined at compil
1f430 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20  e-time.    */ . 
1f440 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1f450 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45  ESTCTRL_BYTEORDE
1f460 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  R: {.      rc = 
1f470 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52  SQLITE_BYTEORDER
1f480 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49  *100 + SQLITE_LI
1f490 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20  TTLEENDIAN*10 + 
1f4a0 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e  SQLITE_BIGENDIAN
1f4b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f4c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1f4d0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f4e0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f4f0 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c  TRL_RESERVE, sql
1f500 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
1f510 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1f520 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  et the nReserve 
1f530 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68  size to N for th
1f540 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1f550 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1f560 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f      ** connectio
1f570 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  n db..    */.   
1f580 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1f590 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b  TCTRL_RESERVE: {
1f5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1f5b0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1f5c0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1f5d0 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
1f5e0 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  ap,int);.      s
1f5f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1f600 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1f610 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1f620 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d  eSetPageSize(db-
1f630 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20  >aDb[0].pBt, 0, 
1f640 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  x, 0);.      sql
1f650 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1f660 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1f670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f680 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
1f690 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1f6a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
1f6b0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c  TIMIZATIONS, sql
1f6c0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
1f6d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1f6e0 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
1f6f0 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
1f700 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69  ations for testi
1f710 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
1f720 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  e .    ** argume
1f730 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73  nt N is a bitmas
1f740 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f  k of optimizatio
1f750 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ns to be disable
1f760 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20  d.  For normal. 
1f770 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20     ** operation 
1f780 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20  N should be 0.  
1f790 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
1f7a0 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20   a test program 
1f7b0 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a  (like the.    **
1f7c0 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20   SQL Logic Test 
1f7d0 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75  or SLT test modu
1f7e0 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20  le) can run the 
1f7f0 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c  same SQL multipl
1f800 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77  e times.    ** w
1f810 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ith various opti
1f820 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c  mizations disabl
1f830 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
1f840 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  t the same answe
1f850 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61  r.    ** is obta
1f860 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61  ined in every ca
1f870 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  se..    */.    c
1f880 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1f890 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
1f8a0 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
1f8b0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1f8c0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1f8d0 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c       db->dbOptFl
1f8e0 61 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61  ags = (u16)(va_a
1f8f0 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78  rg(ap, int) & 0x
1f900 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65  ffff);.      bre
1f910 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1f920 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1f930 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1f940 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1f950 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
1f960 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
1f970 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
1f980 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
1f990 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
1f9a0 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
1f9b0 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
1f9c0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1f9d0 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
1f9e0 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
1f9f0 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
1fa00 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
1fa10 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
1fa20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1fa30 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1fa40 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
1fa50 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1fa60 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
1fa70 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
1fa80 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1fa90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1faa0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1fab0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1fac0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1fad0 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e  EVER_CORRUPT, in
1fae0 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
1faf0 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
1fb00 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
1fb10 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61  ates that the da
1fb20 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61  tabase file is a
1fb30 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20  lways well-.    
1fb40 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65  ** formed and ne
1fb50 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68  ver corrupt.  Th
1fb60 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  is flag is clear
1fb70 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64   by default, ind
1fb80 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20  icating that.   
1fb90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1fba0 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72  es might have ar
1fbb0 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69  bitrary corrupti
1fbc0 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  on.  Setting the
1fbd0 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20   flag during.   
1fbe0 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73   ** testing caus
1fbf0 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72  es certain asser
1fc00 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
1fc10 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65  n the code to be
1fc20 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a   activated.    *
1fc30 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61  * that demonstra
1fc40 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20  t invariants on 
1fc50 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
1fc60 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  base files..    
1fc70 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1fc80 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1fc90 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20  R_CORRUPT: {.   
1fca0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1fcb0 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72  Config.neverCorr
1fcc0 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  upt = va_arg(ap,
1fcd0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1fce0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1fcf0 2a 20 53 65 74 20 74 68 65 20 74 68 72 65 73 68  * Set the thresh
1fd00 6f 6c 64 20 61 74 20 77 68 69 63 68 20 4f 50 5f  old at which OP_
1fd10 4f 6e 63 65 20 63 6f 75 6e 74 65 72 73 20 72 65  Once counters re
1fd20 73 65 74 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f  set back to zero
1fd30 2e 0a 20 20 20 20 2a 2a 20 42 79 20 64 65 66 61  ..    ** By defa
1fd40 75 6c 74 20 74 68 69 73 20 69 73 20 30 78 37 66  ult this is 0x7f
1fd50 66 66 66 66 66 65 20 28 6f 76 65 72 20 32 20 62  fffffe (over 2 b
1fd60 69 6c 6c 69 6f 6e 29 2c 20 62 75 74 20 74 68 61  illion), but tha
1fd70 74 20 76 61 6c 75 65 20 69 73 0a 20 20 20 20 2a  t value is.    *
1fd80 2a 20 74 6f 6f 20 62 69 67 20 74 6f 20 74 65 73  * too big to tes
1fd90 74 20 69 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c  t in a reasonabl
1fda0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
1fdb0 2c 20 73 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f  , so this contro
1fdc0 6c 20 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76  l is.    ** prov
1fdd0 69 64 65 64 20 74 6f 20 73 65 74 20 61 20 73 6d  ided to set a sm
1fde0 61 6c 6c 20 61 6e 64 20 65 61 73 69 6c 79 20 72  all and easily r
1fdf0 65 61 63 68 61 62 6c 65 20 72 65 73 65 74 20 76  eachable reset v
1fe00 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
1fe10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1fe20 54 43 54 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54  TCTRL_ONCE_RESET
1fe30 5f 54 48 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20  _THRESHOLD: {.  
1fe40 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1fe50 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73  lConfig.iOnceRes
1fe60 65 74 54 68 72 65 73 68 6f 6c 64 20 3d 20 76 61  etThreshold = va
1fe70 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1fe80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fe90 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1fea0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1feb0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1fec0 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20  _VDBE_COVERAGE, 
1fed0 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b  xCallback, ptr);
1fee0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1fef0 65 74 20 74 68 65 20 56 44 42 45 20 63 6f 76 65  et the VDBE cove
1ff00 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75  rage callback fu
1ff10 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62  nction to xCallb
1ff20 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74  ack with context
1ff30 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72   .    ** pointer
1ff40 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   ptr..    */.   
1ff50 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1ff60 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52  TCTRL_VDBE_COVER
1ff70 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  AGE: {.#ifdef SQ
1ff80 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
1ff90 47 45 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  GE.      typedef
1ffa0 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63   void (*branch_c
1ffb0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 75  allback)(void*,u
1ffc0 6e 73 69 67 6e 65 64 20 69 6e 74 2c 0a 20 20 20  nsigned int,.   
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
20000 2c 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 3b  ,unsigned char);
20010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
20020 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65  obalConfig.xVdbe
20030 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28  Branch = va_arg(
20040 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61  ap,branch_callba
20050 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ck);.      sqlit
20060 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
20070 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20  VdbeBranchArg = 
20080 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29  va_arg(ap,void*)
20090 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  ;.#endif.      b
200a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
200b0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
200c0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
200d0 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
200e0 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78  R_MMAP, db, nMax
200f0 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ); */.    case S
20100 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
20110 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20  ORTER_MMAP: {.  
20120 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
20130 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
20140 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
20150 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
20160 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
20170 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
20180 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
20190 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
201a0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
201b0 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20  TCTRL_ISINIT);. 
201c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74     **.    ** Ret
201d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
201e0 20 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e   SQLite has been
201f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
20200 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
20210 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20  .    ** not..   
20220 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
20230 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
20240 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NIT: {.      if(
20250 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20260 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29  nfig.isInit==0 )
20270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
20280 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
20290 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
202a0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
202b0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
202c0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64  CTRL_IMPOSTER, d
202d0 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66  b, dbName, onOff
202e0 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a  , tnum);.    **.
202f0 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
20300 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64   control is used
20310 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73   to create impos
20320 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62  ter tables.  "db
20330 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20  " is a pointer. 
20340 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74     ** to the dat
20350 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
20360 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65  .  dbName is the
20370 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28   database name (
20380 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20  ex: "main" or.  
20390 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69    ** "temp") whi
203a0 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20  ch will receive 
203b0 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22  the imposter.  "
203c0 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70  onOff" turns imp
203d0 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20  oster mode on.  
203e0 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74    ** or off.  "t
203f0 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74  num" is the root
20400 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
20410 72 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ree to which the
20420 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a   imposter.    **
20430 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f   table should co
20440 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  nnect..    **.  
20450 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f    ** Enable impo
20460 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77  ster mode only w
20470 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68  hen the schema h
20480 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
20490 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20  parsed.  Then.  
204a0 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c    ** run a singl
204b0 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
204c0 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73  tatement to cons
204d0 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74  truct the impost
204e0 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20  er table in.    
204f0 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63  ** the parsed sc
20500 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e  hema.  Then turn
20510 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62   imposter mode b
20520 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20  ack off again.. 
20530 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
20540 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75  onOff==0 and tnu
20550 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  m>0 then reset t
20560 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c  he schema for al
20570 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75  l databases, cau
20580 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  sing.    ** the 
20590 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70  schema to be rep
205a0 61 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74  arsed the next t
205b0 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64  ime it is needed
205c0 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a  .  This has the.
205d0 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66      ** effect of
205e0 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70   erasing all imp
205f0 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20  oster tables..  
20600 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
20610 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
20620 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  POSTER: {.      
20630 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
20640 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
20650 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
20660 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
20670 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
20680 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73  db->init.iDb = s
20690 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
206a0 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63  (db, va_arg(ap,c
206b0 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20  onst char*));.  
206c0 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73      db->init.bus
206d0 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  y = db->init.imp
206e0 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f  osterTable = va_
206f0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
20700 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54     db->init.newT
20710 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  num = va_arg(ap,
20720 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  int);.      if( 
20730 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
20740 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
20750 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  Tnum>0 ){.      
20760 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
20770 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
20780 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20  tion(db);.      
20790 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
207a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
207b0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
207c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
207d0 64 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41  defined(YYCOVERA
207e0 47 45 29 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69  GE).    /*  sqli
207f0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
20800 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
20810 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45  _PARSER_COVERAGE
20820 2c 20 46 49 4c 45 20 2a 6f 75 74 29 0a 20 20 20  , FILE *out).   
20830 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
20840 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 28 6f 6e  test control (on
20850 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77 68 65  ly available whe
20860 6e 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  n SQLite is comp
20870 69 6c 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  iled with.    **
20880 20 2d 44 59 59 43 4f 56 45 52 41 47 45 29 20 77   -DYYCOVERAGE) w
20890 72 69 74 65 73 20 61 20 72 65 70 6f 72 74 20 6f  rites a report o
208a0 6e 74 6f 20 22 6f 75 74 22 20 74 68 61 74 20 73  nto "out" that s
208b0 68 6f 77 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  hows all.    ** 
208c0 73 74 61 74 65 2f 6c 6f 6f 6b 61 68 65 61 64 20  state/lookahead 
208d0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 69 6e 20  combinations in 
208e0 74 68 65 20 70 61 72 73 65 72 20 73 74 61 74 65  the parser state
208f0 20 6d 61 63 68 69 6e 65 0a 20 20 20 20 2a 2a 20   machine.    ** 
20900 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
20910 65 78 65 72 63 69 73 65 64 2e 20 20 49 66 20 61  exercised.  If a
20920 6e 79 20 73 74 61 74 65 20 69 73 20 6d 69 73 73  ny state is miss
20930 65 64 2c 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  ed, make the.   
20940 20 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 20   ** return code 
20950 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
20960 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
20970 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
20980 52 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 20 7b  RSER_COVERAGE: {
20990 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  .      FILE *out
209a0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 46 49   = va_arg(ap, FI
209b0 4c 45 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  LE*);.      if( 
209c0 73 71 6c 69 74 65 33 50 61 72 73 65 72 43 6f 76  sqlite3ParserCov
209d0 65 72 61 67 65 28 6f 75 74 29 20 29 20 72 63 20  erage(out) ) rc 
209e0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
209f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20a00 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   }.#endif /* def
20a10 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47 45 29  ined(YYCOVERAGE)
20a20 20 2a 2f 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64   */.  }.  va_end
20a30 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
20a40 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c  SQLITE_UNTESTABL
20a50 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  E */.  return rc
20a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20a70 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
20a80 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
20a90 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
20aa0 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
20ab0 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
20ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
20ad0 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
20ae0 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
20af0 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
20b00 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
20b10 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
20b20 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
20b30 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
20b40 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
20b50 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
20b60 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
20b70 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
20b80 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
20b90 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
20ba0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
20bb0 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
20bc0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
20bd0 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
20be0 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
20bf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
20c00 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
20c10 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
20c20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
20c30 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
20c40 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
20c50 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
20c60 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
20c70 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
20c80 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
20c90 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
20ca0 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
20cb0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
20cc0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
20cd0 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
20ce0 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d  me==0 || zParam=
20cf0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
20d00 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
20d10 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
20d20 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
20d30 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65  while( zFilename
20d40 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  [0] ){.    int x
20d50 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e   = strcmp(zFilen
20d60 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
20d70 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
20d80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
20d90 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
20da0 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65     if( x==0 ) re
20db0 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
20dc0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d      zFilename +=
20dd0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
20de0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
20df0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
20e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
20e10 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
20e20 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
20e30 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ameter..*/.int s
20e40 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
20e50 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  an(const char *z
20e60 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
20e70 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e  char *zParam, in
20e80 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73  t bDflt){.  cons
20e90 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
20ea0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
20eb0 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
20ec0 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20  ram);.  bDflt = 
20ed0 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75  bDflt!=0;.  retu
20ee0 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65  rn z ? sqlite3Ge
20ef0 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c  tBoolean(z, bDfl
20f00 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  t) : bDflt;.}../
20f10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34  *.** Return a 64
20f20 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
20f30 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70  ue for a query p
20f40 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c  arameter..*/.sql
20f50 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
20f60 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20  e3_uri_int64(.  
20f70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
20f80 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c  ename,    /* Fil
20f90 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20  ename as passed 
20fa0 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f  to xOpen */.  co
20fb0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
20fc0 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70  ,       /* URI p
20fd0 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20  arameter sought 
20fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
20ff0 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f  64 bDflt       /
21000 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61  * return if para
21010 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67  meter is missing
21020 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
21030 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
21040 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
21050 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
21060 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  );.  sqlite3_int
21070 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26  64 v;.  if( z &&
21080 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
21090 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 30 20  ToI64(z, &v)==0 
210a0 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
210b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
210c0 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
210d0 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
210e0 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
210f0 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
21100 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
21110 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
21120 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
21130 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
21140 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
21150 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
21160 74 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20  t iDb = zDbName 
21170 3f 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  ? sqlite3FindDbN
21180 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
21190 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 69   : 0;.  return i
211a0 44 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61  Db<0 ? 0 : db->a
211b0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a  Db[iDb].pBt;.}..
211c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
211d0 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
211e0 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
211f0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
21200 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
21210 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
21220 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
21230 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
21240 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
21250 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
21260 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
21270 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
21280 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
21290 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
212a0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
212b0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
212c0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
212d0 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
212e0 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
212f0 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
21300 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
21310 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
21320 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
21330 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a  me(pBt) : 0;.}..
21340 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
21350 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  f database is re
21360 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20  ad-only or 0 if 
21370 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74  read/write.  Ret
21380 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20  urn -1 if.** no 
21390 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78  such database ex
213a0 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
213b0 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
213c0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
213d0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
213e0 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
213f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21400 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
21410 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
21420 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
21430 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
21440 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
21450 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
21460 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42  .  }.#endif.  pB
21470 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
21480 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
21490 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
214a0 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
214b0 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74  eeIsReadonly(pBt
214c0 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65  ) : -1;.}..#ifde
214d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
214e0 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f  SNAPSHOT./*.** O
214f0 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f 74  btain a snapshot
21500 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
21510 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74 61  snapshot of data
21520 62 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e 74  base zDb current
21530 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61  ly .** being rea
21540 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a  d by handle db..
21550 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
21560 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 73  napshot_get(.  s
21570 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
21580 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a  onst char *zDb,.
21590 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
215a0 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a  ot **ppSnapshot.
215b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
215c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e  LITE_ERROR;.#ifn
215d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
215e0 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
215f0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
21600 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
21610 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
21620 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
21630 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
21640 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
21650 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
21660 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
21670 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 61 75  );..  if( db->au
21680 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20  toCommit==0 ){. 
21690 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
216a0 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
216b0 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
216c0 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31   iDb==0 || iDb>1
216d0 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20   ){.      Btree 
216e0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
216f0 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  Db].pBt;.      i
21700 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
21710 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
21720 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21730 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
21740 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 2c 20  inTrans(pBt, 0, 
21750 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
21760 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21770 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21780 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
21790 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42  shotGet(sqlite3B
217a0 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
217b0 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20  ppSnapshot);.   
217c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
217d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
217e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
217f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
21800 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
21810 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
21820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21830 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61   Open a read-tra
21840 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
21850 73 6e 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66  snapshot idendif
21860 69 65 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74  ied by pSnapshot
21870 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21880 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a  _snapshot_open(.
21890 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
218a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
218b0 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  b, .  sqlite3_sn
218c0 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
218d0 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
218e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
218f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21900 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
21910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
21920 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
21930 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
21940 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
21950 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
21960 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
21970 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
21980 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
21990 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  ex);.  if( db->a
219a0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  utoCommit==0 ){.
219b0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
219c0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
219d0 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
219e0 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  );.    if( iDb==
219f0 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20  0 || iDb>1 ){.  
21a00 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
21a10 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
21a20 74 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  t;.      if( 0==
21a30 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
21a40 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29  ReadTrans(pBt) )
21a50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
21a60 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
21a70 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42  hotOpen(sqlite3B
21a80 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
21a90 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20  pSnapshot);.    
21aa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21ac0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21ad0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
21ae0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
21af0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
21b00 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71  rSnapshotOpen(sq
21b10 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
21b20 70 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  pBt), 0);.      
21b30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21b40 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
21b50 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
21b60 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
21b70 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
21b80 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
21b90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
21ba0 63 6f 76 65 72 20 61 73 20 6d 61 6e 79 20 73 6e  cover as many sn
21bb0 61 70 73 68 6f 74 73 20 61 73 20 70 6f 73 73 69  apshots as possi
21bc0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 77 61 6c  ble from the wal
21bd0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
21be0 20 77 69 74 68 0a 2a 2a 20 73 63 68 65 6d 61 20   with.** schema 
21bf0 7a 44 62 20 6f 66 20 64 61 74 61 62 61 73 65 20  zDb of database 
21c00 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
21c10 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f  e3_snapshot_reco
21c20 76 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ver(sqlite3 *db,
21c30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
21c40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
21c50 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e  LITE_ERROR;.  in
21c60 74 20 69 44 62 3b 0a 23 69 66 6e 64 65 66 20 53  t iDb;.#ifndef S
21c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
21c80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21c90 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
21ca0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
21cb0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
21cc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
21cd0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
21ce0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
21cf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
21d00 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
21d10 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
21d20 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
21d30 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20  );.  if( iDb==0 
21d40 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  || iDb>1 ){.    
21d50 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
21d60 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
21d70 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
21d80 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
21d90 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
21da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
21db0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
21dc0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
21dd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21de0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
21df0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
21e00 61 70 73 68 6f 74 52 65 63 6f 76 65 72 28 73 71  apshotRecover(sq
21e10 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
21e20 70 42 74 29 29 3b 0a 20 20 20 20 20 20 20 20 73  pBt));.        s
21e30 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
21e40 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  t(pBt);.      }.
21e50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
21e60 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
21e70 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
21e80 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
21e90 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
21ea0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21eb0 20 46 72 65 65 20 61 20 73 6e 61 70 73 68 6f 74   Free a snapshot
21ec0 20 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64   handle obtained
21ed0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e   from sqlite3_sn
21ee0 61 70 73 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f  apshot_get()..*/
21ef0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 6e  .void sqlite3_sn
21f00 61 70 73 68 6f 74 5f 66 72 65 65 28 73 71 6c 69  apshot_free(sqli
21f10 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53  te3_snapshot *pS
21f20 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69  napshot){.  sqli
21f30 74 65 33 5f 66 72 65 65 28 70 53 6e 61 70 73 68  te3_free(pSnapsh
21f40 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ot);.}.#endif /*
21f50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
21f60 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 6e  NAPSHOT */..#ifn
21f70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21f80 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49  COMPILEOPTION_DI
21f90 41 47 53 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  AGS./*.** Given 
21fa0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
21fb0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
21fc0 6e 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  n, return true i
21fd0 66 20 74 68 61 74 20 6f 70 74 69 6f 6e 0a 2a 2a  f that option.**
21fe0 20 77 61 73 20 75 73 65 64 20 61 6e 64 20 66 61   was used and fa
21ff0 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  lse if not..**.*
22000 2a 20 54 68 65 20 6e 61 6d 65 20 63 61 6e 20 6f  * The name can o
22010 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69 6e 20  ptionally begin 
22020 77 69 74 68 20 22 53 51 4c 49 54 45 5f 22 20 62  with "SQLITE_" b
22030 75 74 20 74 68 65 20 22 53 51 4c 49 54 45 5f 22  ut the "SQLITE_"
22040 20 70 72 65 66 69 78 0a 2a 2a 20 69 73 20 6e 6f   prefix.** is no
22050 74 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  t required for a
22060 20 6d 61 74 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73   match..*/.int s
22070 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
22080 74 69 6f 6e 5f 75 73 65 64 28 63 6f 6e 73 74 20  tion_used(const 
22090 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 29 7b  char *zOptName){
220a0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
220b0 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74  nt nOpt;.  const
220c0 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c   char **azCompil
220d0 65 4f 70 74 3b 0a 20 0a 23 69 66 20 53 51 4c 49  eOpt;. .#if SQLI
220e0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
220f0 4d 4f 52 0a 20 20 69 66 28 20 7a 4f 70 74 4e 61  MOR.  if( zOptNa
22100 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 28 76 6f  me==0 ){.    (vo
22110 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
22120 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
22130 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
22140 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 20  .  azCompileOpt 
22150 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c 65  = sqlite3Compile
22160 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a  Options(&nOpt);.
22170 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
22180 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c  rNICmp(zOptName,
22190 20 22 53 51 4c 49 54 45 5f 22 2c 20 37 29 3d 3d   "SQLITE_", 7)==
221a0 30 20 29 20 7a 4f 70 74 4e 61 6d 65 20 2b 3d 20  0 ) zOptName += 
221b0 37 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  7;.  n = sqlite3
221c0 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 4e 61 6d  Strlen30(zOptNam
221d0 65 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20  e);..  /* Since 
221e0 6e 4f 70 74 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  nOpt is normally
221f0 20 69 6e 20 73 69 6e 67 6c 65 20 64 69 67 69 74   in single digit
22200 73 2c 20 61 20 6c 69 6e 65 61 72 20 73 65 61 72  s, a linear sear
22210 63 68 20 69 73 20 0a 20 20 2a 2a 20 61 64 65 71  ch is .  ** adeq
22220 75 61 74 65 2e 20 4e 6f 20 6e 65 65 64 20 66 6f  uate. No need fo
22230 72 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  r a binary searc
22240 68 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  h. */.  for(i=0;
22250 20 69 3c 6e 4f 70 74 3b 20 69 2b 2b 29 7b 0a 20   i<nOpt; i++){. 
22260 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
22270 72 4e 49 43 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c  rNICmp(zOptName,
22280 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d   azCompileOpt[i]
22290 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  , n)==0.     && 
222a0 73 71 6c 69 74 65 33 49 73 49 64 43 68 61 72 28  sqlite3IsIdChar(
222b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 61  (unsigned char)a
222c0 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 5b 6e  zCompileOpt[i][n
222d0 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ])==0.    ){.   
222e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
222f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22300 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
22310 72 6e 20 74 68 65 20 4e 2d 74 68 20 63 6f 6d 70  rn the N-th comp
22320 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
22330 73 74 72 69 6e 67 2e 20 20 49 66 20 4e 20 69 73  string.  If N is
22340 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 0a 2a   out of range,.*
22350 2a 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20  * return a NULL 
22360 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
22370 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
22380 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
22390 74 28 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20  t(int N){.  int 
223a0 6e 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nOpt;.  const ch
223b0 61 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70  ar **azCompileOp
223c0 74 3b 0a 20 20 61 7a 43 6f 6d 70 69 6c 65 4f 70  t;.  azCompileOp
223d0 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 69  t = sqlite3Compi
223e0 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f 70 74 29  leOptions(&nOpt)
223f0 3b 0a 20 20 69 66 28 20 4e 3e 3d 30 20 26 26 20  ;.  if( N>=0 && 
22400 4e 3c 6e 4f 70 74 20 29 7b 0a 20 20 20 20 72 65  N<nOpt ){.    re
22410 74 75 72 6e 20 61 7a 43 6f 6d 70 69 6c 65 4f 70  turn azCompileOp
22420 74 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t[N];.  }.  retu
22430 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
22440 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
22450 4d 50 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47  MPILEOPTION_DIAG
22460 53 20 2a 2f 0a                                   S */.